说我有这个循环:
count = 0
for i in 0...9 {
count += 1
}
我想延迟它。
延迟功能:
// Delay function
func delay(_ delay:Double, closure:@escaping ()->()) {
DispatchQueue.main.asyncAfter( deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}
这意味着如果我想每秒将count
增加1,我会这样做:
count = 0
for i in 0...9 {
delay(1) {
count += 1
}
}
但这不起作用,因为它只会延迟括号中的代码。如何延迟实际循环?我希望延迟停止迭代直到时间过去,然后循环/代码可以再次重复。
答案 0 :(得分:3)
您当前的代码不起作用,因为您正在异步执行增量。这意味着for循环仍将以正常速度运行。
为了达到你想要的效果,你可以使用这样的计时器:
var count = 0
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ _ in
count += 1
print(count)
}
如果您希望它在5次后停止,请执行以下操作:
var count = 0
var timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ t in
count += 1
print(count)
if count >= 5 {
t.invalidate()
}
}
答案 1 :(得分:0)
正如@ Paulw11和@Sweeper建议的那样,您可以使用Timer
来执行此操作。但是,如果代码由于某种原因需要异步,则可以通过递归来异步重新实现循环:
func loop(times: Int) {
var i = 0
func nextIteration() {
if i < times {
print("i is \(i)")
i += 1
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
nextIteration()
}
}
}
nextIteration()
}