2

我已经查看了有关在后台执行核心数据保存的问题的答案,但我发现没有一个直接解决了以下情况:

我已经设置了核心数据,这样当我的应用程序第一次启动时,核心数据会从 plist 中填充,然后保存到持久存储中(全部在后台线程上)。在此期间,应用程序会显示一个带有动画活动指示器的“请稍候”弹出窗口。这似乎工作得很好,并且通常即使用户在填充期间点击主页按钮,应用程序也会完成填充,将应用程序推到后台。但是,该应用程序可能会在此人口完成之前完全终止(我已经成功地通过点击主页,双击主页并从多任务托盘中删除应用程序非常非常快)。在这种情况下,应用程序退出而不将数据保存到商店。在应用程序的下一次启动时,应用程序识别出商店已经存在,因此它不会填充,从而给用户留下一个完全空的数据库。所以问题是/是:

  • 如果人口尚未完成,有没有办法在应用程序终止时完全删除商店?我尝试执行此操作,-applicationWillTerminate:但似乎无法正确识别应用程序是否正在填充。

  • 或者,是否有更好的方法来识别商店何时需要人口?例如,我可以在启动时确定商店是否是空的吗?

4

1 回答 1

2

我建议您使用这种通用方法来解决您的问题:

  1. 在填充阶段结束时,将标志写入您的核心数据库或应用程序默认值(NSUserDefaults);

  2. (现在,当应用程序在完成填充阶段之前终止时,将不会存储标志);

  3. 在启动时,检查该标志;如果它在那里,你就知道填充阶段已经完成,否则你就知道出了点问题。

当然,在填充阶段完成和存储标志之前应用程序终止的可能性很小;除了这个事件不太可能发生之外,无论如何,如果发生这种情况,它只会迫使您的应用程序在下次启动时再次填充数据,但不会导致任何数据一致性问题。

更具体的方法是基于使用beginBackgroundTaskWithExpirationHandler:

您的应用委托的applicationDidEnterBackground:方法有大约 5 秒的时间来完成任何任务并返回。在实践中,此方法应尽快返回。如果该方法在时间用完之前没有返回,您的应用程序将被终止并从内存中清除。如果您仍然需要更多时间来执行任务,请调用该beginBackgroundTaskWithExpirationHandler:方法以请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。无论您是否启动任何后台任务,该applicationDidEnterBackground:方法仍必须在 5 秒内退出。

这将使您有更多时间在应用程序在任何“非病态”情况下终止之前完成填充阶段(即,如果用户像您在测试中所做的那样杀死应用程序,它将不起作用,并且不会安全,以防应用程序本身出现问题并且在后台线程执行填充时崩溃)。

希望这可以帮助。

于 2012-05-02T15:59:42.983 回答