所以我试着在延迟后执行多行代码。grand中央调度中的Asyncafter似乎没有提供一种将信息传递给要执行的代码的方法。例如,我想在0.1秒后执行func(1),在0.2秒后执行func(2),在0.3秒后执行func(3),我该怎么做?
发布于 2020-11-22 01:28:06
你不需要“传递”信息。闭包将自动地“从周围的上下文中常量和变量”:
for i in 0 ..< 1000 {
DispatchQueue.main.asyncAfter(deadline: .now() + Double(i) / 10) {
self.func(i)
}
}
也许你只是以此为例,值得注意的是,如果你想在某个固定的时间间隔做一些事情,asyncAfter
有一些缺点:
asyncAfter
调度的多个单独调度的块将变得有点麻烦和笨拙。asyncAfter
会受到“定时器合并”的影响,即调度的块彼此相差不到10%时,将同时开始触发。(这是一项省电功能。)因此,如果您希望计划在某个固定时间间隔触发某些事件,我们将使用重复计时器:
var i = 0
Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] timer in
guard let self = self, i < 1000 else {
timer.invalidate()
return
}
self.func(i)
i += 1
}
但是,同样,我们不必将变量“传递”给Timer
闭包。我们可以直接在闭包中使用该变量。
但是,如果您真的只调度了三个调用,分别为0.1、0.2和0.3秒,那么asyncAfter
就没问题。但是,如果您计划添加大量此类调用(取消和/或计时器合并成为一个问题),那么可以考虑使用Timer
。
https://stackoverflow.com/questions/64925689
复制相似问题