【问题标题】:On iOS, can you begin work on the background thread before applicationDidEnterBackground is called?在 iOS 上,您可以在调用 applicationDidEnterBackground 之前开始在后台线程上工作吗?
【发布时间】:2013-04-02 15:21:05
【问题描述】:

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

这是场景:

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

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

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

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

【问题讨论】:

    标签: ios concurrency grand-central-dispatch


    【解决方案1】:

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

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

    我会这样安排

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2012-12-26
        • 2012-08-01
        相关资源
        最近更新 更多