- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我试图在延迟后调用一个函数。在 iOS10 上,我可以使用 Timer.scheduledTimer,它确实会在给定延迟后调用我的闭包。但是,在 iOS9 上,我使用的是 DispatchQueue.main.asyncAfter,它会延迟六秒调用我的闭包。
我测试的延迟是 60 秒。 Timer.scheduledTimer 在 60 秒后调用关闭,在 66 秒后调用 DispatchQueue.main.asyncAfter。六秒的延迟是结果,如果我安排两个 60 秒的延迟,则在 132 秒后使用 DispatchQueue.main.asyncAfter 调用第二个延迟。
func delay(delay:Double, closure:@escaping ()->()) {
NSLog("Calling method with delay of: \(delay)")
if #available(iOS 10.0, *) {
Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { (timer) in
closure()
}
} else {
// TODO: Is not accurate, delay of +- 6 seconds
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
closure()
}
}
}
调用延迟函数的代码:
func scheduleStudy(minutes: Int, secondsFromNow: Int) {
// Study notification
if #available(iOS 10.0, *) {
self.addiOS10StudyNotification(minutes: minutes, secondsFromNow: secondsFromNow)
}else{
self.addiOS9StudyNotification(minutes: minutes, secondsFromNow: secondsFromNow)
}
// Study timer
delay(delay: Double(secondsFromNow)) {
self.onStudy(minutes: minutes)
}
NSLog("Scheduled study for \(minutes) minutes in \(secondsFromNow) seconds from now.")
}
使用 Timer.scheduledTimer 规划通知和方法调用
2016-12-06 13:34:06.024714 Mattie[1386:360881] Calling method with delay of: 0.0
2016-12-06 13:34:06.025072 Mattie[1386:360881] Scheduled study for 1 minutes in 0 seconds from now.
2016-12-06 13:34:06.036953 Mattie[1386:360881] Calling method with delay of: 60.0
2016-12-06 13:34:06.037191 Mattie[1386:360881] Scheduled pause for 1 minutes in 60 seconds from now.
2016-12-06 13:34:06.052520 Mattie[1386:360881] Calling method with delay of: 120.0
2016-12-06 13:34:06.053162 Mattie[1386:360881] Scheduled study for 1 minutes in 120 seconds from now.
2016-12-06 13:34:06.066838 Mattie[1386:360881] Calling method with delay of: 180.0
2016-12-06 13:34:06.067027 Mattie[1386:360881] Scheduled finish in 180 seconds from now.
暂停被称为:
2016-12-06 13:35:06.038307 Mattie[1386:360881] ON PAUSE
2016-12-06 13:35:06.065389 Mattie[1386:360881] Added pause timer for 1 minutes
13:34:06 计划,13:35:06 调用
使用 DispatchQueue.main.asyncAfter 规划通知和方法调用
2016-12-06 13:36:48.845838 Mattie[1390:361681] Calling method with delay of: 0.0
2016-12-06 13:36:48.847389 Mattie[1390:361681] Scheduled study for 1 minutes in 0 seconds from now.
2016-12-06 13:36:48.854336 Mattie[1390:361681] Calling method with delay of: 60.0
2016-12-06 13:36:48.854543 Mattie[1390:361681] Scheduled pause for 1 minutes in 60 seconds from now.
2016-12-06 13:36:48.861424 Mattie[1390:361681] Calling method with delay of: 120.0
2016-12-06 13:36:48.861601 Mattie[1390:361681] Scheduled study for 1 minutes in 120 seconds from now.
2016-12-06 13:36:48.868464 Mattie[1390:361681] Calling method with delay of: 180.0
2016-12-06 13:36:48.868644 Mattie[1390:361681] Scheduled finish in 180 seconds from now.
暂停被称为:
2016-12-06 13:37:54.865400 Mattie[1390:361681] ON PAUSE
2016-12-06 13:37:54.897354 Mattie[1390:361681] Added pause timer for 1 minutes
13:36:48 计划,13:37:54 调用
最佳答案
asyncAfter
仅保证至少等待指定的时间。
如果你想在 iOS9 上有精确的时间间隔,你可能仍然应该使用 Timer。
Timer.scheduledTimer(timeInterval: delay,
target: self,
selector: #selector(executeClosure),
userInfo: nil,
repeats: false)
executeClosure 是一个执行最后保存的闭包的函数。
关于swift - DispatchQueue.main.asyncAfter 不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40995461/
我正在尝试为 TextView 制作动画,让字符串字符一个接一个地出现,然后在 0.5 秒延迟后从第一个字符开始一个接一个地消失。 我很接近,我遇到的唯一问题是第一个字符会立即被删除,所以就好像它从未
我正在尝试运行一个简单的 iOS 应用程序,该应用程序会在指定时间后将通知推送到用户屏幕。 到目前为止,这是我所拥有的(从另一个线程借来的): DispatchQueue.global(qos: .b
在我的 iPad 应用程序中,我试图让 tableView 以预定的间隔滚动。为此,我创建了一段代码,为每个滚动创建一个闭包。然而,关闭的执行时间比我想要的时间晚了几秒钟。这是一个简化的 Playgr
最终,我很快就在 swift 中使用了 asyncAfter 特性,它确实有一些延迟,而且看起来与普通代码不同。 异步代码: DispatchQueue.main.asyncAfter(deadlin
我正在开发一个应用程序,其中我尝试调试的 403 禁止错误实际上是由您每分钟可以向端点发出的请求数量的上限引起的(愚蠢的我)。 很好,我决定将我的网络请求放到 DispatchQueue 上(无论如何
我想知道 DispatchQueue.asyncAfter(deadline:execute:) 在进入后台时的行为。我试图在 documentation 中找到更多信息,但那里什么也没有。 让我们假
我试图在延迟后调用一个函数。在 iOS10 上,我可以使用 Timer.scheduledTimer,它确实会在给定延迟后调用我的闭包。但是,在 iOS9 上,我使用的是 DispatchQueue.
所以我有一个带有单选按钮的应用程序来检查任务,只要我让动画完成,一切都会按预期工作,但如果我同时按下两个按钮,我会收到错误: libc++abi.dylib: terminating with unc
在我的游戏中, meteor 从天而降。 spawnMeteorite 函数在游戏开始时被调用,并在满足延迟后调用自身,此时陨石之间的新延迟比以前略短。 func spawnMeteorite(tim
这个问题在这里已经有了答案: How do I run Asynchronous callbacks in Playground (8 个答案) 关闭 4 年前。 我在 Playground 中运行
我有一个调度异步,我希望屏幕上弹出 4 个警报......然后在显示新警报之前每个警报都被关闭。 (我在我的警报之间设置了 3 秒的延迟) class ViewController: UIViewCo
我在修改对象的属性后调用 DispatchQueue.main.asyncAfter 方法(我用 KVO 触发它)。我只显示一秒钟的确认 View ,然后运行一个在 UI 上做其他事情的 block
我提出了以下结构,作为在网络连接速度较慢时提醒用户的一种方式。 当函数要调用服务器时,它会创建一个 ResponseTimer。这会设置延迟通知,仅当 responseTimer var isOn =
我正在使用 AVAudioPlayer 播放唱片。在每个回放 session 之间我有 0 到 10 秒的间隔。为了制作这个间隔,我正在使用 AVAudioPlayerDelegate 并且播放完成后
我很难理解 DispatchSourceTimer 之间的主要区别, Timer和 asyncAfter (在我的例子中,调度一个需要每 X 秒运行一次的任务,尽管了解定时器的差异可能对有用)(或者除
在 Swift 的早期版本中,此代码可以完美运行。 DispatchQueue.main.asyncAfter(deadline: .now() + delay) { timer in sel
我想在调用 deinit 时退出“DispatchQueue.main.asyncAfter”。 subView.swift DispatchQueue.main.asyncAfter(deadlin
这个问题在这里已经有了答案: Cancel a timed event in Swift? (7 个答案) 关闭 5 年前。 描述: 我目前正在使用以下代码来查看用户是否已停止在搜索栏中键入内容。每
这个问题已经有答案了: How to prevent a Command Line Tool from exiting before asynchronous operation completes
下面的延迟代码在 iOS 14.0 以下运行良好,但在 iOS 14.0 模拟器中,它每 2 秒重复调用一次。有什么我错过的吗? DispatchQueue.main.asyncAfter(dea
我是一名优秀的程序员,十分优秀!