ios - 如何在ios swift

时间:2015-09-21 08:32:33

标签: 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. 还有其他更好的方法吗。

  4. 提前致谢

1 个答案:

答案 0 :(得分:0)

实际上,如果你开始backgroundTask,你不仅限于30秒,而是限制在10分钟或者当前的限制。

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

因此,在您的情况下,我并不关心返回NoDataNewData的正确值。开始同步作为后台任务并致电completionHandler(UIBackgroundFetchResult.NewData)

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