当应用程序在iOS中进入非活动/后台/暂停状态时,调度队列中的任务会发生什么?

Rob*_*Rob 19 objective-c grand-central-dispatch ios

我一直在搜索关于应用程序状态和Grand Central Dispatch的Apple文档,但我没有找到这个问题的好答案.

根据Apple的文档,在iOS 4.0上:

应用程序在后台但不执行代码.系统会在适当的时间自动将应用程序移动到此状态.暂停时,应用程序基本上在其当前状态下冻干,并且不执行任何代码.在内存不足的情况下,系统可能会清除已暂停的应用程序,恕不另行通知,以便为前台应用程序腾出更多空

因此,假设系统没有清除挂起的应用程序(挂起 - >未运行转换),当前在调度队列中执行的任务会发生什么?短语"基本上冻干"还有很多不足之处 - 究竟什么是冷冻干燥的?

我的解释是当应用程序转换回活动状态时,应用程序在暂停时使用的GCD队列需要恢复; 根据这种解释,暂停前GCD队列中存在的任务将消失.我的解释是否正确?

Rya*_*yan 19

当应用程序暂停时,整个过程将被冻结.一旦恢复,你可以指望恢复过程,好像什么都没发生一样.您的应用程序的GCD逻辑队列不会消失,它们会保留在内存中.GCD在您的进程中创建的线程为您的队列提供服务,恢复原状,就像没有发生任何事情一样.

所以你的解释是不正确的:暂停前GCD队列中存在的任务在恢复时不会消失.他们从未离开; 他们只是暂停了.

  • 注意:应用程序在后台有可能被杀死.杀死应用程序会破坏GCD队列,因此您必须能够在重新启动时重新创建它. (3认同)
  • 至少与iOS 9一样,这仍然是正确的.此外,如果您使用`dispatch_after`排队一个块,并且当应用程序处于挂起状态时块的预期开火日期过去,则该块将立即立即执行该应用程序已恢复.应用程序恢复后,它不会被丢弃,也不会触发N-minus-delay秒(它是一个绝对日期,而不是相对日期,用于计算何时应该执行该块). (3认同)