当应用程序重新启动到后台时,是否会调度主队列?
Does main queue get dispatched when app re-launches into background?
我的应用程序使用 UIBackgroundMode,即当蓝牙事件发生时,即使应用程序未处于活动状态,它也会被 iOS 重新启动。因此,蓝牙事件由 iOS 调度到后台队列(队列由我指定)。
但是我可以将代码分派回主队列吗,即
DispatchQueue.main.async { }
(Swift)
dispatch_async(dispatch_get_main_queue(), ^{ })
(Objective-C)
并假设它的 运行 循环是 运行ning,那是我的块被分派了吗?或者主队列是否在后台模式下暂停,因此我应该避免向其添加调度块?
在后台分派到主队列应该是安全的。
当您的应用程序处于后台时,它所做的一切在技术上都是在后台线程上完成的,因为系统将您的应用程序标记为较低优先级。但是,为了让系统让你的代码 运行 它至少需要有一个主队列。因此,可以安全地假设您将有权访问主队列。如果需要,您可以从那里创建其他工作队列,但所有内容很可能会被推到一个后台线程上执行,因此您可能看不到太多好处。
另请注意,测试后台线程可能有点棘手。后台线程将始终执行,并且在模拟器中似乎永远不会关闭。如果 Xcode 已连接并调试,在设备上进行测试时也会发生同样的情况。如果需要,系统还会让您的应用程序 运行 在进入后台后连续 10 分钟(我最后检查过,这可能在过去一两年内发生了变化),之后它会需要类似蓝牙事件的东西提到在后台获得更多时间。
资料来源:处理后台应用程序的不幸经验。
我的应用程序使用 UIBackgroundMode,即当蓝牙事件发生时,即使应用程序未处于活动状态,它也会被 iOS 重新启动。因此,蓝牙事件由 iOS 调度到后台队列(队列由我指定)。
但是我可以将代码分派回主队列吗,即
DispatchQueue.main.async { }
(Swift)
dispatch_async(dispatch_get_main_queue(), ^{ })
(Objective-C)
并假设它的 运行 循环是 运行ning,那是我的块被分派了吗?或者主队列是否在后台模式下暂停,因此我应该避免向其添加调度块?
在后台分派到主队列应该是安全的。
当您的应用程序处于后台时,它所做的一切在技术上都是在后台线程上完成的,因为系统将您的应用程序标记为较低优先级。但是,为了让系统让你的代码 运行 它至少需要有一个主队列。因此,可以安全地假设您将有权访问主队列。如果需要,您可以从那里创建其他工作队列,但所有内容很可能会被推到一个后台线程上执行,因此您可能看不到太多好处。
另请注意,测试后台线程可能有点棘手。后台线程将始终执行,并且在模拟器中似乎永远不会关闭。如果 Xcode 已连接并调试,在设备上进行测试时也会发生同样的情况。如果需要,系统还会让您的应用程序 运行 在进入后台后连续 10 分钟(我最后检查过,这可能在过去一两年内发生了变化),之后它会需要类似蓝牙事件的东西提到在后台获得更多时间。
资料来源:处理后台应用程序的不幸经验。