ios - 如何在 ios swift 中正确实现后台获取

标签 ios swift background-fetch

我遇到一种情况,我使用后台提取来调用我的数据同步过程,由于同步函数是一项繁重的任务,因此它在后台线程中执行。

这是我的代码,

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    print("Background Fetch")
    Utilities.syncCompleted = false // declared as :> static var syncCompleted:Bool = false
    BackgroundSync().startSync() // heavy background task, and iam updating [Utilities.syncCompleted = true) on thread completion
    while Utilities.syncCompleted == false {
        NSThread.sleepForTimeInterval(1) // sleep for sometime
    }
    if Utilities.syncCompleted{
        completionHandler(UIBackgroundFetchResult.NewData)
    }else {
        completionHandler(UIBackgroundFetchResult.NoData)
    }
}

现在我有一些问题:

  1. 由于后台获取时间为 30 秒,如果我的任务在 30 秒内没有完成,那么会发生什么,因为我无法将completionHandler 设置为 .NoData 或 .Failure

  2. 如果开发人员未在 30 秒内指定,是否会设置任何默认的completionHandler 值(例如 .NoData)。

  3. 还有其他更好的方法吗?

提前致谢

最佳答案

实际上,如果您要启动 backgroundTask,您的时长并不限于 30 秒,而是 10 分钟或任何当前限制。

后台获取是应用程序的全面启动,包括访问主线程、UI 更改等。本质上相当于启动应用程序减去实际的屏幕显示。后台任务对您可以执行的操作有更多限制,但允许花费更长的时间。

因此,在您的情况下,我不太关心返回 NoDataNewData 的正确值。启动同步后台任务并调用 completionHandler(UIBackgroundFetchResult.NewData)

如果您想尽可能公平地对待系统,您可以检查 application.backgroundTimeRemaining ,然后在到期之前安排 dispatch_after 。因此,如果您的任务在它之前完成,它将发送收到的 NewData/NoData,但如果需要更长的时间,那么您的dispatch_after block 将发送 NewData 并完成它。

关于ios - 如何在 ios swift 中正确实现后台获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32690653/

相关文章:

ios - 如何在 React Native 项目中重新生成 ios 文件夹?

swift - 强制展开可选的优点是什么?

Flutter WorkManager 后台获取带有 StateFull 小部件的示例

ios - 在 Xcode 中,如何抑制菜单添加的 "MARK:"部分?

ios - 如何在 Xcode 中隐藏代码文档/注释?

java - GCDAsyncsocket广播到所有IP

ios - UIView 框架和边界错误

xcode - 如何继续调用函数直到它返回与以前不同的输出?

ios - 正确使用后台获取完成处理程序

ios - expo.io 的 BackgroundFetch 没有运行定义的任务