如何为循环的每次迭代添加延迟

时间:2018-03-19 18:55:39

标签: ios swift

说我有这个循环:

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

    }

}

但这不起作用,因为它只会延迟括号中的代码。如何延迟实际循环?我希望延迟停止迭代直到时间过去,然后循环/代码可以再次重复。

2 个答案:

答案 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()
}