我试图在用户按下主屏幕按钮时保存Core Data。我想从
-applicationDidEnterBackground:
中执行此操作,但是它没有被调用。这可能是因为不能从这里保存Core Data,或者仅仅是因为操作完成的时间不够。然而,从-applicationWillResignActive:
中可以正常工作。我只是好奇哪个委托方法是最好的来执行此操作,以及为什么-applicationDidEnterBackground:
没有起作用。(从输出结果可以看出,两种方法都被调用了。如果我从-applicationWillResignActive:
中删除保存操作,则根本不会发生任何事情,因此不是一种阻塞另一种的情况。)// CALLS SAVE
- (void)applicationWillResignActive:(UIApplication *)application {
[[self model] saveCoreData:@"SAVE FROM: applicationWillResignActive"];
NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__);
}
// DOES NOT CALL SAVE
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[self model] saveCoreData:@"SAVE FROM: applicationDidEnterBackground"];
NSLog(@"APPDEL: %s", __PRETTY_FUNCTION__);
}
.
// CONSOLE OUTPUT
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationWillResignActive:]
2013-03-21 cvb[6724:907] APPDEL: -[AppDelegate applicationDidEnterBackground:]
2013-03-21 cvb[6724:907]
2013-03-21 cvb[6724:907] SAVE: SAVE FROM: applicationWillResignActive
2013-03-21 cvb[6724:907] SAVE: Saving successful ...
编辑:
最终我做了以下修改:
- (void)applicationDidEnterBackground:(UIApplication *)application {
__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
[[self model] saveCoreData:@"[ENTERING BACKGROUND]"];
}