Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不';后台时间到期时,是否所有后台线程都挂起?_Ios_Objective C_Multithreading - Fatal编程技术网

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:
过期处理程序之外后,它将按预期工作。是的,我的意思是;)。祝贺你,编辑。您可以再次检查:)。如果还不够好,告诉我。