在我使用iOS 9.2的应用程序中,Swift 2.1我需要在应用程序进入后台时将一些数据保存到核心数据中。为此,我在UIApplicationDidEnterBackgroundNotification
通知的调用路径中注册了每个视图控制器,每个实例方法用于保存相应的数据。
我在多个地方读到,默认情况下,应用程序大约需要5秒才能完成执行,因此我们需要使用beginBackgroundTaskWithExpirationHandler
将其延长到大约5分钟。以下是响应上述通知的选择器方法示例。
func applicationEntersBackground()
{
print("Before Extension: \(UIApplication.sharedApplication().backgroundTimeRemaining)")
let taskID = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil)
print("During Extension: \(UIApplication.sharedApplication().backgroundTimeRemaining)")
saveCoreData()
if(taskID != UIBackgroundTaskInvalid)
{
UIApplication.sharedApplication().endBackgroundTask(taskID)
}
print("After Extension: \(UIApplication.sharedApplication().backgroundTimeRemaining)")
}
以下是print()语句的结果
Before Extension: 179.933103708318
During Extension: 179.930266333336
After Extension: 179.922843541659
我怀疑是
beginBackgroundTaskWithExpirationHandler
的通话对剩余时间没有影响?applicationEntersBackground
方法返回,类似的通知就会发送到另一个VC的相应方法。假设总延长持续时间为180秒,VC1在通知处理上花费大约10秒,VC2通知处理程序在beginBackgroundTaskWithExpirationHandler - endBackgroundTask
个呼叫之间大约需要170秒吗? endBackgroundTask
调用后立即恢复生命,并可能在下一个VC收到通知之前终止应用程序吗?感谢任何帮助。
答案 0 :(得分:0)
查看backgroundTimeRemaining
的{{3}}:
当应用程序在前台运行时,此属性中的值仍然适当大。如果应用程序使用beginBackgroundTaskWithExpirationHandler:方法启动一个或多个长时间运行的任务,然后转换为后台,则会调整此属性的值以反映应用程序剩余运行的时间。
回答你的问题:
backgroundTimeRemaining
会保持在180左右,这样您就可以知道一旦启动后台任务,您将拥有什么时间。此值不表示在没有后台任务的情况下允许运行多长时间。beginBackgroundTaskWithExpirationHandler
会产生影响,正如您所看到的,剩余时间会减少(因为该方法不会耗费太多时间,所以会减少很小的值)beginBackgroundTaskWithExpirationHandler
和endBackgroundTask
之间的时间。你可以在你的通话之间分配你需要的任何时间间隔,只要你不超过180秒限制endBackgroundTask
,申请将被暂停,无论花费2秒还是179秒。您可以找到有关应用程序输入后台documentation的更多详细信息。我建议您阅读文档,它可能会澄清您在此问题上可能遇到的其他问题。