Swift循环中的延迟

8

I have this delay function:

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
我该怎么做呢? 谢谢。

2
最后一个基本问题包括所有相关代码,实际上是一个MCVE,包括当前输出和期望输出。提问得很好! - luk2302
我假设延迟函数来自https://dev59.com/gGAg5IYBdhLWcg3wDHQ3#24318861,如果是这种情况,您应该在问题中添加链接以进行适当的归属。 - Martin R
你考虑过使用NSTimer吗? - Will M.
请将以下与程序编写有关的内容从英语翻译成中文。仅返回翻译后的文本:请不要在您的问题中包含答案,那是用于回答的部分。如果您对答案有补充,请在评论中提出。如果您基于其他答案想出了一种新的独特解决方案,请自行发布答案。 - luk2302
3个回答

6
尝试将延迟时间与索引相乘。
func start(){
   for index in 1...3 {
      delay(3.0 * index){
         println(index)
      }
   }
}

那段代码并没有真正回答问题。实际上,通过索引乘以值对于每次执行延迟函数闭包时捕获的索引值没有影响。 - mz2
啊,我误解了问题的一部分,等15分钟间隔过去后我会调整我的投票...我以为问题只涉及到看到值“3”被重复打印(而不是1、2、3),但实际上在当前版本的Swift中并没有发生这种情况。 - mz2
此外,您的解决方案还在每个for循环迭代中捕获了“index”(作为计算“3.0 * index”表达式的返回值的一部分),因此最后一个索引值会被重复传递给打印语句的行为也不会发生。 - mz2
谢谢,我使用了另一种类型的for循环:for var index = 0; index < 3; index++。使用for...in时,它与delay(3.0 * Double(index))配合工作。 - Zoltan
没错,这确实可以解释为什么你会在输出中反复看到“3”。很好。 - mz2

3

如果你在循环的每个迭代中看到打印出来的索引值为3,你可以执行以下操作以确保捕获闭包的正确(当前)迭代器变量的值:

func start() {
    for index in 1...3 {
        let i = index
        delay(3.0 * i) {
            print(i)
        }
    }
}

I am not seeing that behaviour though with Xcode 7.3 & Swift 2.2 – the values printed are 1, 2, 3 with your version of the delay function. Are you perhaps using a very old version of Swift? This blog post actually covers the Swift for loop behaviour with value capture.

As noted in the other answer, multiplying the index with 3.0 accomplishes the 3,6,9 second delays.


谢谢,您的解决方案适用于两种类型的for循环。 - Zoltan

0
如果您正在寻找更复杂的方法,请查看类型DelayManagerLoopManager这里
它们可以实现简单直观的循环语法,例如:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接