我有将系统事件存储到Core Data Database的应用程序。要执行保存,我使用MagicalRecord。
所以,在我init
的记录器类中,我有:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDidFinishLaunchingNotification) name:UIApplicationDidFinishLaunchingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleWillTerminateNotification) name:UIApplicationWillTerminateNotification object:nil];
在句柄函数中,我使用text和timestamp属性存储简单实体:
- (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),但#34;都不会终止"。
如果错过发布活动,我会不会感到惊讶,因为我可以预期在发布通知后会调用init
方法。
我可以做些什么来存储终止事件?
答案 0 :(得分:0)
我有一个答案:
看起来当应用程序被终止时,不会让我保存在新的后台线程中。但保存当前线程工作正常。所以我所要做的就是通过调用saveWithBlockAndWait:
代替saveWithBlock:
来改变保存方法以保存在当前线程中
- (void)handleWillTerminateNotification
{
[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
DBMessage *dbMessage = [DBMessage createEntityInContext:localContext];
dbMessage.text = @"Will terminate";
dbMessage.timestamp = [NSDate date];
}];
}
现在事件已成功保存在DB上。