ios - 如何在 ios swift 中正确实现后台获取
Posted
技术标签:
【中文标题】ios - 如何在 ios swift 中正确实现后台获取【英文标题】:ios - How to implement background fetch correctly in ios swift 【发布时间】:2015-09-21 08:32:33 【问题描述】:我有一种情况,我正在使用后台获取来调用我的数据同步进程,由于同步功能是一项繁重的任务,它在后台线程中执行。
这是我的代码,
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)
现在我有一些问题:
由于后台获取时间为 30 秒,如果我的任务未在 30 秒内完成,那么会发生什么,因为我无法将 completionHandler 设置为 .NoData 或 .Failure
如果开发者未在 30 秒内指定,是否设置了任何默认的 completionHandler 值(如 .NoData)。
还有其他更好的方法吗?
提前致谢
【问题讨论】:
如果后台获取时间过长,系统会将其关闭。通过 .Failure 很好(除非你一直这样做),但是当系统关闭你的进程时,我希望下一次获取的优先级更低。而且我认为你这样做的方式很好。 【参考方案1】:实际上,如果您开始 backgroundTask
,则不限于 30 秒,而是 10 分钟或任何当前限制。
后台获取是应用程序的全面启动,包括访问主线程、UI 更改等。基本上相当于启动应用程序减去实际的屏幕显示。后台任务在你能做的事情上受到更多限制,但允许花费更长的时间。
因此,在您的情况下,我不太关心返回 NoData
或 NewData
的正确值。作为后台任务启动同步并致电completionHandler(UIBackgroundFetchResult.NewData)
。
如果您想对系统尽可能公平,您可以检查application.backgroundTimeRemaining
,然后在到期前安排dispatch_after
。因此,如果您的任务在它之前完成,它将发送收到的 NewData/NoData,但如果需要更长的时间,那么您的 dispatch_after 块将发送 NewData 并完成它。
【讨论】:
后台任务和后台抓取不同以上是关于ios - 如何在 ios swift 中正确实现后台获取的主要内容,如果未能解决你的问题,请参考以下文章