Woj*_*lik 6 multithreading ios swift
我想知道DispatchQueue.asyncAfter(deadline:execute:)在进入后台时的行为方式。我试图在文档中找到更多信息,但什么也没有。
让我们假设我调用的情况:
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { ... }
对我来说最有趣的部分是知道计时器何时倒计时 60 秒停止和恢复。
寻找DispatchQueue.asyncAfter(deadline:execute:)与DispatchQueue.asyncAfter(wallDeadline:execute:)我之间的差异,我从 Apple Staff(来源)那里找到了这个信息,它实际上回答了这个问题:
顺便说一句,你知道为什么 Swift Dispatch 库中提供了这两种 distict 类型吗?
这些模型模拟了墙时间(由 gettimeofday 返回)和马赫绝对时间(由 mach_absolute_time 返回)之间的差异。后者与系统时钟变化无关,但会在您睡觉时停止。在 C API 中,一切都被扁平化到马赫绝对时间,这意味着您会丢失关键信息。考虑一下如果您在将来安排一个计时器 1 秒,然后系统休眠 2 秒会发生什么。
明确DispatchQueue.asyncAfter(deadline:execute:)使用绝对时间并根据此DispatchQueue.asyncAfter(wallDeadline:execute:)使用gettimeofday(墙壁时间)。
这是另一个来源:dispatch_time 和 dispatch_walltime 之间有什么区别,在什么情况下最好使用一个或另一个?
基于此,我准备了一个测试来确认:
override func viewDidLoad() {
super.viewDidLoad()
self.textView.text.append(
"expected times: \n1. \(Date().addingTimeInterval(60.0 * 2))\n" +
"2. \(Date().addingTimeInterval(60.0 * 3))\n" +
"3. \(Date().addingTimeInterval(60.0 * 5))\n\n")
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0 * 2) {
self.textView.text.append("\n\(Date()) fired based on ABSOLUTE time (1)!")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0 * 3) {
self.textView.text.append("\n\(Date()) fired based on ABSOLUTE time (2)")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0 * 5) {
self.textView.text.append("\n\(Date()) fired based on ABSOLUTE time (3)!")
}
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 60.0 * 2) {
self.textView.text.append("\n\(Date()) fired based on WALL time (1)!")
}
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 60.0 * 3) {
self.textView.text.append("\n\(Date()) fired based on WALL time (2)")
}
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 60.0 * 5) {
self.textView.text.append("\n\(Date()) fired based on WALL time (3)!")
}
}
Run Code Online (Sandbox Code Playgroud)
我在带有分离调试器的真实设备上运行它并锁定手机。3.5 分钟后,当我恢复应用程序时:
基于 WALL 时间发射 (1)!
基于WALL时间发射(2)!
这两个事件正是在我恢复应用程序时触发的。这就证明了上面的说法。基于绝对时间的事件稍后出现,这证实了他们的计时器已停止。
如果应用程序已因其他原因在后台运行(例如,它正在播放音乐并打开了音频的后台模式,或者它正在执行后台核心定位并具有核心位置的后台模式已打开)。
否则,它将在后台暂停。
| 归档时间: |
|
| 查看次数: |
3224 次 |
| 最近记录: |