Ios 为什么不';后台时间到期时,是否所有后台线程都挂起?
我的应用程序中有一些后台线程,其中一些Ios 为什么不';后台时间到期时,是否所有后台线程都挂起?,ios,objective-c,multithreading,Ios,Objective C,Multithreading,我的应用程序中有一些后台线程,其中一些NSTimers运行在NSDefaultRunLoopMode模式下。当我按下home按钮时,应用程序进入后台 如果我没有在applicationidentinterbackground:中调用beginBackgroundTaskWithExpirationHandler:,当应用程序处于后台时,线程将挂起。但是如果我调用beginBackgroundTaskWithExpirationHandler:线程即使在过期处理程序返回后也不会挂起 为什么后台线程
NSTimer
s运行在NSDefaultRunLoopMode
模式下。当我按下home按钮时,应用程序进入后台
如果我没有在applicationidentinterbackground:
中调用beginBackgroundTaskWithExpirationHandler:
,当应用程序处于后台时,线程将挂起。但是如果我调用beginBackgroundTaskWithExpirationHandler:
线程即使在过期处理程序返回后也不会挂起
为什么后台线程在一种情况下保持运行,而在另一种情况下不保持运行?在第二种情况下,后台线程何时将被挂起?根据本文档
此方法允许您的应用程序在转换到后台后继续运行一段时间
这就是为什么如果在ApplicationIdentinterBackground:
中调用beginBackgroundTaskWithExpirationHandler:
,线程不会挂起
及
对该方法的每次调用必须通过对endBackgroundTask:方法的匹配调用来平衡。运行后台任务的应用程序运行它们的时间有限。(您可以使用backgroundTimeRemaining属性了解可用时间。)如果您不调用endBackgroundTask:对于时间到期前的每个任务,系统将关闭应用程序。如果您在handler参数中提供了一个block对象,系统将在时间到期之前调用您的handler,以便您有机会结束任务
因此,在第二种情况下,当您使用
beginBackgroundTaskWithExpirationHandler:
时,通过在ExpirationHandler之外添加endBackgroundTask:
,后台线程将挂起。您使用过模拟器吗?您是在从Xcode运行应用程序时这样做的吗?这会改变后台运行行为。确保通过单击设备屏幕上的应用图标来运行应用程序,而不是从Xcode运行。是的,我正在模拟器中运行。我想我只需要在过期处理程序中调用endBackgroundTask:
。在beginBackgroundTaskWithExpirationHandler:
中添加此调用后,后台线程将按预期挂起。在第二种情况下,即使在过期处理程序返回后,后台线程也不会挂起。我很难理解为什么会出现这种情况。您应该在过期处理程序结束后添加endBackgroundTask:
。我想我只需要在过期处理程序中添加它。将此调用添加到endBackgroundTask:
过期处理程序之外后,它将按预期工作。是的,我的意思是;)。祝贺你,编辑。您可以再次检查:)。如果还不够好,告诉我。