我想知道
假设我调用以下内容:
顺便问一下,你知道为什么Swift Dispatch库提供了这两种不同的类型吗?它们模拟了墙上时间(由gettimeofday返回)和Mach绝对时间(由mach_absolute_time返回)之间的差异。后者独立于系统时钟更改,但在睡眠时停止。在C API中,所有内容都被压缩为Mach绝对时间,这意味着您会丢失关键信息。考虑一下如果您安排一个定时器在未来1秒触发,然后系统睡眠2秒会发生什么。
为了清楚起见,DispatchQueue.asyncAfter(deadline:execute :)使用绝对时间,而DispatchQueue.asyncAfter(wallDeadline:execute :)使用gettimeofday(墙上时间)。
这里是另一个来源:dispatch_time和dispatch_walltime之间的区别是什么?在什么情况下最好使用其中之一? 测试
基于此,我准备了一个测试来确认它:
DispatchQueue.asyncAfter(deadline:execute:)
在进入后台时的行为。我尝试在documentation中找到更多信息,但没有找到任何内容。假设我调用以下内容:
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { ... }
- 如果我在10秒后进入后台会发生什么?
- 它会在后台模式下完成吗?
- 如果不是,假设我在2分钟后重新打开应用程序。它会立即调用闭包还是等待剩余50秒后再调用?
更新
寻找DispatchQueue.asyncAfter(deadline:execute:)
和DispatchQueue.asyncAfter(wallDeadline:execute:)
之间的区别,我从Apple员工(source)那里找到了这些信息,实际上回答了这个问题:顺便问一下,你知道为什么Swift Dispatch库提供了这两种不同的类型吗?它们模拟了墙上时间(由gettimeofday返回)和Mach绝对时间(由mach_absolute_time返回)之间的差异。后者独立于系统时钟更改,但在睡眠时停止。在C API中,所有内容都被压缩为Mach绝对时间,这意味着您会丢失关键信息。考虑一下如果您安排一个定时器在未来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)!")
}
}
结果
我在真实设备上使用分离式调试器运行它并锁定手机。 3.5分钟后,当我恢复应用程序时,出现了:
基于WALL时间触发(1)!
基于WALL时间触发(2)!
这两个事件恰好在我恢复应用程序时触发。 这证明了上面的说法。 基于绝对时间的事件稍后出现,这证实了它们的计时器已停止。