我认为DispatchTime和DispatchWallTime之间的区别在于应用程序是挂起了,还是设备屏幕被锁定了,或者别的什么: DispatchTime应该暂停,而DispatchWallTime应该继续运行,因为现实世界中的时钟一直在走。
所以我写了一个小测试应用:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationDidEnterBackground(_ application: UIApplication) {
print("backgrounding the app, starting timers for 60 seconds", Date())
DispatchQueue.main.asyncAfter(deadline: .now() + 60) {
print("deadline 60 seconds ended", Date())
}
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 60) {
print("wallDeadline 60 seconds ended", Date())
}
}
func applicationWillEnterForeground(_ application: UIApplication) {
print("app coming to front", Date())
}
}我在我的设备上运行了应用程序。我关闭了应用程序,等待了一段时间,然后将应用程序带到了前台。有时“等待一段时间”包括关闭屏幕。我得到的结果如下:
backgrounding the app, starting timers for 60 seconds 2018-08-15 17:41:18 +0000
app coming to front 2018-08-15 17:41:58 +0000
wallDeadline 60 seconds ended 2018-08-15 17:42:24 +0000
deadline 60 seconds ended 2018-08-15 17:42:24 +0000
backgrounding the app, starting timers for 60 seconds 2018-08-15 17:42:49 +0000
app coming to front 2018-08-15 17:43:21 +0000
wallDeadline 60 seconds ended 2018-08-15 17:43:55 +0000
deadline 60 seconds ended 2018-08-15 17:43:55 +0000deadline定时器触发之前的延迟并不像我预期的那样长:它比60秒的截止时间晚了6秒,尽管我让应用程序“休眠”的时间比我想象的要长得多。但更令人惊讶的是,两个计时器同时触发。
那么wallDeadline在iOS上做了什么与deadline不同的事情呢?
发布于 2018-10-17 05:43:23
这个问题已经存在很长一段时间了,没有任何答案,所以我想试一试,并指出我在实践中注意到的细微差别。
DispatchTime应该暂停,而DispatchWallTime应该继续运行,因为现实世界中的时钟会继续运行
你在这一点上是对的,至少他们应该这样做。然而,要检查DispatchTime是否按预期工作是非常棘手的。当iOS应用程序在Xcode会话下运行时,它有无限的后台时间,并且不会被挂起。如果没有连接Xcode,我也不能通过运行应用程序来实现这一点,所以无论在什么情况下DispatchTime都会暂停,这仍然是一个大问题。但是,需要注意的主要一点是,DispatchTime并不依赖于系统时钟。
DispatchWallTime的工作原理大致相同(它没有被挂起),只是它的依赖于系统时钟。为了看到不同之处,你可以尝试更长一点的计时器,比如5分钟。之后,转到系统设置,并将时间设置为向前1小时。如果您现在打开应用程序,您会注意到,WallTimer立即过期,而DispatchTime将继续等待时间。
https://stackoverflow.com/questions/51863940
复制相似问题