2

我正在更新我的应用程序中的一些内容,我希望在用户退出应用程序时完成。看来我必须停止当前正在运行的更新并在该applicationDidEnterBackground方法中启动另一个更新。如果我可以在调用该方法之前将一些工作标记为我想在后台运行的东西,那会更方便。

这是场景:

  • 我正在尝试更新内容并开始运行需要一些时间的 SQL 更新。(超过您必须从 . 返回的 5 秒applicationDidEnterBackground。)
  • 用户离开应用程序。当前更新已暂停,但我真的希望它完成。
  • 我可以开始一个新的更新,从另一个停止的地方开始,但是如果用户切换回应用程序,我就会遇到 SQL 级别的并发问题。

将 SQL 查询分解为更小的批次以便我可以在applicationDidEnterBackground回调中干净地切换是唯一的选择吗?它几乎使执行时间加倍。(我不担心操作系统会杀死我的后台任务,简历处理得很好。)

理想情况下,我能够让现有的工作在后台无缝地继续(在操作系统的乐趣下),这可能吗?有更好的选择吗?

(我已经阅读了Programming Guide关于执行后台任务的部分。)

4

2 回答 2

3

您可以继续运行当前线程。您不必停止其中任何一个并开始新的。

您唯一需要做的事情是,如果在进入后台时使用 beginBackgroundTaskWithExpirationHandler(如 proxi 所述)并在完成后使用 endBackgroundTask。此方法可让您的应用程序最多执行 10 分钟。您的应用程序的 UI 将无法访问(因为用户切换到另一个应用程序),但您的应用程序的所有线程将继续运行。当您执行 endBackgroundTask 或 10 分钟到期时,系统将暂停所有线程。

我会这样组织

  • 您是否正在处理正在运行的线程

  • 在 applicationDidEnterBackground 调用 beginBackgroundTaskWithExpirationHandler。将 UIBackgroundTaskIdentifier 保存在可访问的某个地方。

  • 在处理线程结束时,检查 UIBackgroundTaskIdentifier 是否不为 0,如果不为 0,则调用 endBackgroundTask。将 UIBackgroundTaskIdentifier 设置为零。

于 2013-04-02T15:41:05.690 回答
2

如果我理解正确,您只需将长时间运行的操作包装到 beginBackgroundTaskWithExpirationHandler 块中。有关如何使用它的详细信息,请参阅该方法的文档。

于 2013-04-02T15:33:32.687 回答