用户退出应用程序时保存核心数据?

时间:2013-03-21 12:42:16

标签: iphone ios objective-c cocoa-touch core-data

当用户按下主页按钮时,我正在尝试保存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]"];
}

1 个答案:

答案 0 :(得分:2)

查看UIApplicationDelegate protocol reference

基本上,这是您可能对applicationDidEnterBackground:

感兴趣的部分
  

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