当应用程序重新进入后台时,主队列是否会被调度?

8

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

然而,我能否将代码分派回主队列,即

DispatchQueue.main.async { } (Swift)

dispatch_async(dispatch_get_main_queue(), ^{ }) (Objective-C)

并且假设其运行循环正在运行,我的块被分派?或者主队列在后台模式下被挂起,因此我应该避免向其中添加分派块?


你尝试过做同样的事情吗? - Sachin Vas
我进行了一个实验,发现在 iOS 后台模式下启动应用程序时,似乎主循环仍在运行,因为块被执行了。但是我不能假设 iOS 总是会像这样行事。如果它能继续运行主循环,那么对于我的应用程序来说将会更加容易,因为我只需要在必要时调度到主队列,而不需要线程同步。 - Lars Blumberg
1个回答

8
当应用程序在后台时,将任务分派到主队列是安全的。由于系统将您的应用程序标记为较低优先级,因此它执行的所有操作技术上都在后台线程上完成。但是,为了让系统运行您的代码,它至少需要一个主队列。因此,可以安全地假设您将可以访问主队列。如果需要,您可以从那里创建其他工作队列,但是所有内容很可能都会被推到一个后台线程上进行执行,因此您可能看不到太多好处。
还要注意,测试后台线程可能有点棘手。在模拟器中,后台线程将始终被执行,并且似乎永远不会关闭。如果使用Xcode连接和调试设备进行测试,则同样会发生这种情况。如果需要,在进入后台后,系统还允许您的应用程序连续运行10分钟(我上次检查时是这样的,可能在过去一两年中已经发生了变化),之后需要像您提到的蓝牙事件一样才能在后台获取额外时间。
来源:处理后台应用程序的不幸经历。

你确定需要10分钟吗?文档说明应用程序在切换到后台模式前只有10秒钟的时间,否则就会被挂起。 - Lars Blumberg
1
没错,如果你没有后台服务(比如位置更新),那么最多只有10秒钟的时间。但是如果有后台服务,系统会允许位置更新持续最长10分钟。当然,如果其他事件给了你的应用更多的后台时间,比如重大位置变化或蓝牙更新,那就不一样了。总之,在开发后台运行的应用时,你需要随时准备好被关闭。 - esthepiking

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接