我的应用程序使用UIBackgroundMode,即当应用程序未处于活动状态时蓝牙事件发生时,它会被iOS重新启动.因此,iOS会将蓝牙事件分派到后台队列(队列由我指定).
但是我可以将代码发送回主队列,即
DispatchQueue.main.async { }
(迅速)
dispatch_async(dispatch_get_main_queue(), ^{ })
(目标C)
并假设其运行循环正在运行,这是我的块被调度?或者主队列是否以后台模式挂起,因此我应该避免向其添加调度块?
在后台调度到主队列应该是安全的。
当您的应用程序在后台运行时,由于系统将您的应用程序标记为较低优先级,因此它所做的所有操作都会在后台线程上完成。但是,为了使系统允许您的代码运行,它至少需要有一个主队列。因此,可以安全地假设您将有权访问主队列。您可以根据需要从那里创建其他工作队列,但是很可能所有内容都将被推送到一个后台线程中执行,因此您可能看不到太多好处。
另请注意,测试后台线程可能会有些棘手。后台线程将始终执行,并且在模拟器中似乎永远不会关闭。在设备上测试是否已连接Xcode并进行调试时,也会发生相同的情况。该系统还可以让您的应用在进入后台后连续10分钟运行(最后一次检查,有可能在最近一两年内发生了变化),并且需要像您提到的蓝牙事件之类的东西才能获得额外的支持时间在后台。
资料来源:不幸的是,与后台应用程序打交道的经验。