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

Posted

技术标签:

【中文标题】当用户退出应用程序时保存核心数据?【英文标题】:Saving Core Data when the user exits the application? 【发布时间】:2013-03-21 12:42:15 【问题描述】:

当用户按下主页按钮时,我正在尝试保存核心数据。我想从-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]"];

【问题讨论】:

郭干杯,你也赢了。 applicationDidEnterBackground中model的值是多少?我想它不是零? 您的 saveCoreData 方法是否异步工作?还是在完成保存之前一直阻塞?节省需要多长时间? 保存超过 5 秒?如果是,请尝试使用 beginBackgroundTaskWithExpirationHandler.. 从不同线程中的 ios 请求后台执行时间。 我也会尝试优化 Core Data,以节省性能。检查此核心数据优化章节并检查显示核心数据活动的仪器:developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/… 【参考方案1】:

查看UIApplicationDelegate protocol reference。

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

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

【讨论】:

以上是关于当用户退出应用程序时保存核心数据?的主要内容,如果未能解决你的问题,请参考以下文章

关于退出应用程序的问题(保存数据和加载数据)

如何在 Cordova 应用程序退出时保存状态?

核心数据:NSManagedObjectContext 未保存/获取请求失败,直到应用退出和重新启动

最佳核心数据保存策略(何时将数据保存到磁盘)

用户退出应用程序时在设备上安全保存私人数据

核心数据提交通知