循环中的快速延迟

时间:2016-04-28 14:23:18

标签: ios swift loops delay

我有这个延迟功能:

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

我如何实现这一目标? 谢谢,

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)

如果您正在寻找更复杂的方法,请查看DelayManagerLoopManager 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)