当用户按下主页按钮时,我正在尝试保存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]"];
}
答案 0 :(得分:2)
查看UIApplicationDelegate protocol reference。
基本上,这是您可能对applicationDidEnterBackground:
您应该执行与调整用户界面相关的任何任务 在此方法退出之前,但其他任务(如保存状态)应该 根据需要移动到并发调度队列或辅助线程。 因为它可能是你开始的任何后台任务 applicationDidEnterBackground:直到该方法之后才会运行 退出,您应该在之前请求额外的后台执行时间 开始那些任务。换句话说,先打电话 beginBackgroundTaskWithExpirationHandler:然后在a上运行任务 调度队列或辅助线程。