我的应用程序中有一些后台线程,我在NSTimer
模式下运行了一些NSDefaultRunLoopMode
。当我按下主页按钮时,应用程序转到后台。
如果我在beginBackgroundTaskWithExpirationHandler:
中没有调用applicationDidEnterBackground:
,则在应用程序处于后台时线程会被暂停。但是如果我调用beginBackgroundTaskWithExpirationHandler:
线程即使在到期处理程序返回之后也不会被挂起。
为什么后台线程在一个案例中继续运行,而在另一个案例中它们没有?后台线程何时会在第二种情况下被暂停?
答案 0 :(得分:1)
根据此文件beginBackgroundTaskWithExpirationHandler:
此方法可让您的应用在转换为后台后继续运行一段时间。
这就是为什么如果您在beginBackgroundTaskWithExpirationHandler:
中致电applicationDidEnterBackground:
,线程就不会被暂停。
和
必须通过对 endBackgroundTask:方法的匹配调用来平衡对此方法的每次调用。运行后台任务的应用程序运行它们的时间有限。 (您可以使用backgroundTimeRemaining属性找出可用的时间。)如果您没有在时间到期之前调用endBackgroundTask:对于每个任务,系统会终止应用程序。如果在handler参数中提供块对象,系统会在时间到期之前调用您的处理程序,以便您有机会结束任务。
因此,当您使用beginBackgroundTaskWithExpirationHandler:
正确使用endBackgroundTask:
并在到期处理程序之外添加endBackgroundTask:
时,后台线程会在第二种情况下被暂停。