当用户退出应用程序时保存核心数据?
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: 然后在一个任务上运行 调度队列或辅助线程。
【讨论】:
以上是关于当用户退出应用程序时保存核心数据?的主要内容,如果未能解决你的问题,请参考以下文章