ios Magical Record 保存在 UIApplicationWillTerminateNotification

Posted

技术标签:

【中文标题】ios Magical Record 保存在 UIApplicationWillTerminateNotification【英文标题】:ios Magical Record save on UIApplicationWillTerminateNotification 【发布时间】:2015-05-14 15:27:28 【问题描述】:

我有将系统事件存储到核心数据数据库的应用程序。为了执行保存,我使用 MagicalRecord。

所以,在init 的记录器类中,我有:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDidFinishLaunchingNotification) name:UIApplicationDidFinishLaunchingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleWillTerminateNotification) name:UIApplicationWillTerminateNotification object:nil];

在句柄函数中,我存储带有文本和时间戳属性的简单实体:

- (void)handleDidFinishLaunchingNotification

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Did finish launching";
        dbMessage.timestamp = [NSDate date];
    ];


- (void)handleWillTerminateNotification

    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Will terminate";
        dbMessage.timestamp = [NSDate date];
    ];

当我几次打开和关闭(没有崩溃)应用程序时,在我的数据库中我可以看到“确实完成启动”条目(不止一个,所以我确定应用程序已关闭,不仅移动到 BG),而且没有一个“将终止”。

如果错过了启动事件,我不会那么惊讶,因为我可以预期在发布通知后会调用init 方法。

我可以做些什么来存储终止事件?

【问题讨论】:

【参考方案1】:

我有一个答案:

看起来当应用程序终止时,不会让我保存在新的后台线程中。但是保存在当前线程中工作正常。所以我所要做的就是通过调用saveWithBlockAndWait:而不是saveWithBlock:来更改保存方法以保存在当前线程中

- (void)handleWillTerminateNotification

    [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) 
        DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
        dbMessage.text = @"Will terminate";
        dbMessage.timestamp = [NSDate date];
    ];

现在事件已成功保存在数据库中。

【讨论】:

以上是关于ios Magical Record 保存在 UIApplicationWillTerminateNotification的主要内容,如果未能解决你的问题,请参考以下文章

Magical Record 不会保存到 SQLite 文件

Magical Record - 在主线程块 ui 中获取,在后台返回 nil

更改的属性未与 Magical Record 一起保存

AFNetwork、Magical Record和块内保存

Plain Core Data vs Core Data + Magical Record

使用 Swift 3 在 Magical Record 中保存上下文时出错