我有这个延迟功能:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
从这里: dispatch_after - GCD in swift?
此代码:
func start(){
for index in 1...3 {
delay(3.0){
println(index)
}
}
}
3秒后,它给出:
3
3
3
我的目标:
3秒后:1
6秒后:2
9秒后:3
我如何实现这一目标? 谢谢,
答案 0 :(得分:6)
尝试将延迟与索引相乘
nlargest
答案 1 :(得分:3)
如果您(奇怪地)将3作为索引的值在循环的每个迭代中打印出来,您可以执行以下操作以确保捕获迭代器变量的正确(当前)值关闭:
func start() {
for index in 1...3 {
let i = index
delay(3.0 * i) {
print(i)
}
}
}
我没有看到Xcode 7.3&amp ;; Swift 2.2 - 使用您的延迟函数版本打印的值为1,2,3。您是否正在使用Swift的旧版本? This blog post实际上涵盖了带有值捕获的Swift for循环行为。
如另一个答案所述,将指数乘以3.0可以完成3,6,9秒的延迟。
答案 2 :(得分:0)
如果您正在寻找更复杂的方法,请查看DelayManager
和LoopManager
here类型。
它们启用简单的循环语法,如下所示:
let loopId = LoopManager.shared.with(interval: 0.5, alternating: { [weak self] in
self?.alpha = 1
}, and: { [weak self] in
self?.alpha = 0.2
})
您也可以取消循环:
LoopManager.shared.stop(withUniqueId: loopId)