UIApplicationDidEnterBackgroundNotification剩余执行时间

时间:2016-01-12 06:18:06

标签: ios swift

在我使用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

我怀疑是

  1. 为什么在我要求延长时间之前,剩余时间约为180秒?我多次尝试过。它总是接近180秒而不是建议的5秒。
  2. 为什么beginBackgroundTaskWithExpirationHandler的通话对剩余时间没有影响?
  3. 一旦VC的applicationEntersBackground方法返回,类似的通知就会发送到另一个VC的相应方法。假设总延长持续时间为180秒,VC1在通知处理上花费大约10秒,VC2通知处理程序在beginBackgroundTaskWithExpirationHandler - endBackgroundTask个呼叫之间大约需要170秒吗?
  4. 在不同VC的通知处理程序的连续调用之间,显然存在非常短的延长请求未激活的时段。在这种情况下,时间如何发挥作用? 5秒计数器(如果它是真的)在endBackgroundTask调用后立即恢复生命,并可能在下一个VC收到通知之前终止应用程序吗?
  5. 感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

查看backgroundTimeRemaining的{​​{3}}:

  

当应用程序在前台运行时,此属性中的值仍然适当大。如果应用程序使用beginBackgroundTaskWithExpirationHandler:方法启动一个或多个长时间运行的任务,然后转换为后台,则会调整此属性的值以反映应用程序剩余运行的时间。

回答你的问题:

    当应用程序处于前台时,
  1. backgroundTimeRemaining会保持在180左右,这样您就可以知道一旦启动后台任务,您将拥有什么时间。此值不表示在没有后台任务的情况下允许运行多长时间。
  2. beginBackgroundTaskWithExpirationHandler会产生影响,正如您所看到的,剩余时间会减少(因为该方法不会耗费太多时间,所以会减少很小的值)
  3. 这里重要的是调用beginBackgroundTaskWithExpirationHandlerendBackgroundTask之间的时间。你可以在你的通话之间分配你需要的任何时间间隔,只要你不超过180秒限制
  4. 一旦您致电endBackgroundTask,申请将被暂停,无论花费2秒还是179秒。
  5. 您可以找到有关应用程序输入后台documentation的更多详细信息。我建议您阅读文档,它可能会澄清您在此问题上可能遇到的其他问题。