当应用程序重新启动到后台时,是否会调度主队列?

时间:2017-01-11 09:57:28

标签: ios objective-c swift grand-central-dispatch

我的应用程序使用UIBackgroundMode,即使在应用程序未处于活动状态时蓝牙事件发生时,它也会被iOS重新启动。因此,iOS会将蓝牙事件分派到后台队列(队列由我指定)。

但是我可以将代码发送回主队列,即

DispatchQueue.main.async { }(斯威夫特)

dispatch_async(dispatch_get_main_queue(), ^{ })(目标-C)

并假设其运行循环正在运行,那是我的块被派遣了吗?或者主队列是否以后台模式挂起,因此我应该避免向其添加调度块?

1 个答案:

答案 0 :(得分:5)

在后台调度到主队列应该是安全的。

当你的应用程序在后台时,它所做的一切都是在后台线程上完成的,因为系统会将你的应用程序标记为较低的优先级。但是,为了让系统让代码运行,它至少需要一个主队列。因此,可以安全地假设您可以访问主队列。如果需要,您可以从那里创建其他工作队列,但所有内容很可能会被推送到一个后台线程上执行,因此您可能看不到多少好处。

另请注意,测试背景线程可能有点棘手。后台线程将始终执行,并且在模拟器中似乎永远不会关闭。如果连接Xcode并进行调试,在设备上进行测试时也会发生同样的情况。系统还允许您的应用程序连续运行10分钟(最后一次我检查,在过去一两年内可能会发生变化),如果需要进入后台,之后需要提供额外的蓝牙事件。时间在后台。

来源:处理背景应用程序的不幸经验。