当后台时间到期时,为什么不是所有后台线程都被挂起?

时间:2017-11-01 05:57:24

标签: ios objective-c multithreading

我的应用程序中有一些后台线程,我在NSTimer模式下运行了一些NSDefaultRunLoopMode。当我按下主页按钮时,应用程序转到后台。

如果我在beginBackgroundTaskWithExpirationHandler:中没有调用applicationDidEnterBackground:,则在应用程序处于后台时线程会被暂停。但是如果我调用beginBackgroundTaskWithExpirationHandler:线程即使在到期处理程序返回之后也不会被挂起。

为什么后台线程在一个案例中继续运行,而在另一个案例中它们没有?后台线程何时会在第二种情况下被暂停?

1 个答案:

答案 0 :(得分:1)

根据此文件beginBackgroundTaskWithExpirationHandler:

  

此方法可让您的应用在转换为后台后继续运行一段时间。

这就是为什么如果您在beginBackgroundTaskWithExpirationHandler:中致电applicationDidEnterBackground:,线程就不会被暂停。

  

必须通过对 endBackgroundTask:方法的匹配调用来平衡对此方法的每次调用。运行后台任务的应用程序运行它们的时间有限。 (您可以使用backgroundTimeRemaining属性找出可用的时间。)如果您没有在时间到期之前调用endBackgroundTask:对于每个任务,系统会终止应用程序。如果在handler参数中提供块对象,系统会在时间到期之前调用您的处理程序,以便您有机会结束任务。

因此,当您使用beginBackgroundTaskWithExpirationHandler:正确使用endBackgroundTask:并在到期处理程序之外添加endBackgroundTask:时,后台线程会在第二种情况下被暂停。