Swift新手:将Objective集成代码移植到Swift上,由Dart/Dart调用。当我背景或锁定屏幕遗留的Obj应用程序,它几乎立即暂停所有的执行。然而,在我的Swift代码端口中没有发生相同的行为,我在Swift中使用的DispatchQueue与遗留的Obj应用程序中的相同,
挂起的原因很重要,因为一旦用户锁定了iPhone屏幕,AppleHealth就会加密它的所有数据,并且它是不可用的。我的理解也是正确的,当您挂起一个DispatchQueue时,当前正在执行的块将完成,但是子序列块将不会开始执行。据我所知,Swift代码端口模仿Obj逻辑,任何关于它的行为为何不同或我可能缺少什么的提示都是非常感谢的。
我要用
DispatchQueue.global(qos: .default).async {
/* code */
}
如果能让新的应用程序立即挂起我提交给DispatchQueue的所有执行代码,当背板或锁屏时,我会非常高兴。
发布于 2019-04-01 06:52:00
当应用程序被挂起时,运行的任何东西,无论是在主队列上还是在后台global
队列上,都会被挂起。
你在这个应用程序中做了什么让它在后台运行吗?例如,如果您通过Xcode调试器运行应用程序(例如,这样您可以查看print
语句或其他什么),它会改变应用程序的生命周期并使其在后台运行。( Xcode“观察者效应”?( Lol.)例如,您是否通过Xcode调试器运行此程序?
此外,如果您的应用程序有一定的后台功能,这也可以保持应用程序的活力。
由于您不能通过Xcode调试器运行应用程序来查看应用程序的生命周期,所以我将演示使用统一测井监视应用程序进度的过程。使用统一日志,我可以从我的iPhone控制台监视macOS上的这些日志语句,甚至根本不需要运行Xcode。
考虑这样的事情:
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忙碌的进程。)
所以我就:
我们可以清楚地看到,当我挂起应用程序时,应用程序就会停止(包括在后台队列上运行的任务)。(显然,除了上面的os_log
消息之外,我还在AppDelegate
中放置了类似的语句,这样我也可以在这里看到生命周期事件。)总之,这就是我的控制台显示的:
当“滴答5”出现时,我离开了我的应用程序,在应用程序被完全挂起之前花了几秒钟的时间,但是你可以看到,在“滴答7”和“applicationDidEnterBackground”出现之后,应用程序停止了运行。大约10秒后,我重新启动了这个应用程序,这时你会看到这个应用恢复了活力,然后继续滴答作响,就在它停下来的地方。
所以,如果你的应用程序还在运行,要么它被附加到Xcode调试器,要么你有什么东西让应用程序在后台运行。但是通常情况下,当你离开一个应用程序时,它会被挂起,你会看到我上面描述的行为。
顺便提一下,有关使用统一日志、配置设备等的更多信息,请参见WWDC 2016视频统一日志记录和活动跟踪。
https://stackoverflow.com/questions/55448140
复制相似问题