0

我有一种情况,我正在使用后台获取来调用我的数据同步过程,因为同步功能是一项繁重的任务,它在后台线程中执行。

这是我的代码,

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. 有没有其他更好的方法来做到这一点。

提前致谢

4

1 回答 1

0

实际上,如果您开始 a backgroundTask,则不限于 30 秒,而是 10 分钟或任何当前限制。

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

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

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

于 2016-09-04T09:41:37.263 回答