DispatchQueue.global(qos: .default) 后台或锁屏时继续,如何暂停?
DispatchQueue.global(qos: .default) continues when app is backgrounded or screen locked, how to suspend?
Swift 新手:将 Objective-C AppleHealth 集成代码移植到由 Flutter/Dart 调用的 Swift。当我后台运行或锁定旧版 Obj-C 应用程序时,它几乎会立即暂停所有执行。
但是,在我的 Swift 代码端口中没有发生相同的行为,我在 Swift 中使用与旧版 Obj-C 应用程序相同的 DispatchQueue,
之所以暂停很重要,是因为一旦用户锁定 iPhone 屏幕,AppleHealth 会加密其所有数据,因此无法使用。
我的理解也是正确的,当您暂停 DispatchQueue 时,当前正在执行的块将完成,但后续块将不会开始执行。
据我所知,Swift 代码端口模仿了 Obj-C 逻辑,任何关于为什么它表现不同或我可能遗漏的提示都将不胜感激。
我正在使用
发送
DispatchQueue.global(qos: .default).async {
/* code */
}
如果可以让新应用立即暂停我提交给 DispatchQueue 的所有执行代码,当后台或锁屏时我会非常高兴。
当一个应用程序被挂起时,任何 运行ning,无论是在主队列还是后台 global
队列,也会被挂起。
您是否在应用程序中执行任何操作以使其 运行在后台运行?例如,如果您通过 Xcode 调试器 运行 应用程序(例如,您可以查看 print
语句或其他任何内容),它会更改应用程序生命周期并保持它 运行宁在后台。 (Xcode“观察者效应”?哈哈。)您是通过 Xcode 调试器 运行 调试它吗?
此外,如果您的应用启用了某些后台功能,这也可以使应用保持活动状态。
由于您无法通过 Xcode 调试器 运行 应用程序来查看应用程序生命周期,因此我将演示使用 Unified Logging 来监控我的应用程序进度的过程。使用统一日志记录,我可以从我的 macOS 控制台在我的 iPhone 上监视这些日志语句,甚至根本不需要 Xcode 运行ning。
考虑如下:
import UIKit
import os.log
private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "ViewController")
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
os_log("viewDidLoad", log: log, type: .debug)
startTask()
}
func startTask() {
DispatchQueue.global().async {
var i = 0
while true {
let start = Date()
while Date().timeIntervalSince(start) < 1 { }
os_log("tick %d", log: log, type: .debug, i)
i += 1
}
}
}
}
(注意,通常你不应该像这样旋转,但我这样做是为了有一个故意让 CPU 忙碌的过程。)
然后我:
- 安装在我的设备上,
- 退出 Xcode、
- 启动 macOS 控制台应用程序,
- 在控制台应用程序中,我使用“操作”»“包括调试消息”启用了调试日志记录,
- 过滤日志,所以我只从我的子系统中看到 activity(我个人总是为此使用我的包标识符),并且
- 运行 我的应用直接在我的 iOS 设备上。
当我暂停应用程序时,我们可以清楚地看到应用程序停止(包括后台队列中的此任务 运行ning)。 (显然,除了上面的 os_log
消息外,我还在我的 AppDelegate
中放置了类似的语句,这样我也可以在这里看到生命周期事件。)无论如何,这就是我的控制台显示的内容:
我在“tick 5”出现时离开了我的应用程序,应用程序在完全暂停前花了几秒钟,但你可以看到应用程序在“tick 7”和“tick 7”后停止了 运行ning applicationDidEnterBackground”出现。大约 10 秒后我重新启动了该应用程序,此时您会看到该应用程序恢复了生命并继续滴答作响,就在它停止的地方。
因此,如果您的应用程序仍在 运行ning,要么它附加到 Xcode 调试器,要么您有一些东西让应用程序 运行ning 在后台。但一般来说,当您离开一个应用程序时,它会被暂停,您会看到我上面概述的行为。
顺便说一下,有关使用统一日志记录、配置设备等的更多信息,请参阅 WWDC 2016 视频 Unified Logging and Activity Tracing。
Swift 新手:将 Objective-C AppleHealth 集成代码移植到由 Flutter/Dart 调用的 Swift。当我后台运行或锁定旧版 Obj-C 应用程序时,它几乎会立即暂停所有执行。 但是,在我的 Swift 代码端口中没有发生相同的行为,我在 Swift 中使用与旧版 Obj-C 应用程序相同的 DispatchQueue,
之所以暂停很重要,是因为一旦用户锁定 iPhone 屏幕,AppleHealth 会加密其所有数据,因此无法使用。 我的理解也是正确的,当您暂停 DispatchQueue 时,当前正在执行的块将完成,但后续块将不会开始执行。 据我所知,Swift 代码端口模仿了 Obj-C 逻辑,任何关于为什么它表现不同或我可能遗漏的提示都将不胜感激。
我正在使用
发送DispatchQueue.global(qos: .default).async {
/* code */
}
如果可以让新应用立即暂停我提交给 DispatchQueue 的所有执行代码,当后台或锁屏时我会非常高兴。
当一个应用程序被挂起时,任何 运行ning,无论是在主队列还是后台 global
队列,也会被挂起。
您是否在应用程序中执行任何操作以使其 运行在后台运行?例如,如果您通过 Xcode 调试器 运行 应用程序(例如,您可以查看 print
语句或其他任何内容),它会更改应用程序生命周期并保持它 运行宁在后台。 (Xcode“观察者效应”?哈哈。)您是通过 Xcode 调试器 运行 调试它吗?
此外,如果您的应用启用了某些后台功能,这也可以使应用保持活动状态。
由于您无法通过 Xcode 调试器 运行 应用程序来查看应用程序生命周期,因此我将演示使用 Unified Logging 来监控我的应用程序进度的过程。使用统一日志记录,我可以从我的 macOS 控制台在我的 iPhone 上监视这些日志语句,甚至根本不需要 Xcode 运行ning。
考虑如下:
import UIKit
import os.log
private let log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "ViewController")
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
os_log("viewDidLoad", log: log, type: .debug)
startTask()
}
func startTask() {
DispatchQueue.global().async {
var i = 0
while true {
let start = Date()
while Date().timeIntervalSince(start) < 1 { }
os_log("tick %d", log: log, type: .debug, i)
i += 1
}
}
}
}
(注意,通常你不应该像这样旋转,但我这样做是为了有一个故意让 CPU 忙碌的过程。)
然后我:
- 安装在我的设备上,
- 退出 Xcode、
- 启动 macOS 控制台应用程序,
- 在控制台应用程序中,我使用“操作”»“包括调试消息”启用了调试日志记录,
- 过滤日志,所以我只从我的子系统中看到 activity(我个人总是为此使用我的包标识符),并且
- 运行 我的应用直接在我的 iOS 设备上。
当我暂停应用程序时,我们可以清楚地看到应用程序停止(包括后台队列中的此任务 运行ning)。 (显然,除了上面的 os_log
消息外,我还在我的 AppDelegate
中放置了类似的语句,这样我也可以在这里看到生命周期事件。)无论如何,这就是我的控制台显示的内容:
我在“tick 5”出现时离开了我的应用程序,应用程序在完全暂停前花了几秒钟,但你可以看到应用程序在“tick 7”和“tick 7”后停止了 运行ning applicationDidEnterBackground”出现。大约 10 秒后我重新启动了该应用程序,此时您会看到该应用程序恢复了生命并继续滴答作响,就在它停止的地方。
因此,如果您的应用程序仍在 运行ning,要么它附加到 Xcode 调试器,要么您有一些东西让应用程序 运行ning 在后台。但一般来说,当您离开一个应用程序时,它会被暂停,您会看到我上面概述的行为。
顺便说一下,有关使用统一日志记录、配置设备等的更多信息,请参阅 WWDC 2016 视频 Unified Logging and Activity Tracing。