4

当用户按下主页按钮时,我正在尝试保存核心数据。我想这样做,-applicationDidEnterBackground:但它没有被调用。这可能是因为您无法从此处保存核心数据,或者只是因为没有足够的时间完成操作。但是,它确实有效,-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]"];
}
4

1 回答 1

2

查看UIApplicationDelegate 协议参考

基本上,这是您可能感兴趣的部分applicationDidEnterBackground:

您应该在此方法退出之前执行与调整用户界面相关的任何任务,但其他任务(例如保存状态)应根据需要移动到并发调度队列或辅助线程。因为您在 applicationDidEnterBackground: 中启动的任何后台任务很可能在该方法退出之前不会运行,因此您应该在启动这些任务之前请求额外的后台执行时间。换句话说,首先调用 beginBackgroundTaskWithExpirationHandler: 然后在调度队列或辅助线程上运行任务。

于 2013-03-21T13:13:16.913 回答