1

我正在尝试延迟循环某些内容(仅作为概念证明),这是为了其他内容。但为了简化它,这里有一个例子。

所以在这个例子中,我有一个带有“文本”的字符串,我想循环添加另一个字符串让我们说 10 次。唯一的事情是我希望每次迭代都有延迟。到目前为止,这是我的代码。

// 全局变量

var myString = "文本"

// 按钮内的动作

    let delayInSeconds = 1.0
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {

        for _ in 1...10 {
           self.myString += "another text"
        }
    }
    labelOne.text = myString

}

我应该补充一点,结果是立即添加了所有 10 个“另一个文本”,没有任何延迟。

谢谢你

4

2 回答 2

4

在您的示例中,您在同一个工作单元中附加了十次字符串。尝试在每个循环中分派一次工作:

for delay in 1...10 {
    let delayInSeconds = Double(delay)
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
        self.myString += "another text"
        labelOne.text = myString
    }
}

但是,此循环不适用于任意大的值。它也没有提供我们可能想要的用户界面更改的那种精确时间。为此,我们可以使用Timer。这是使用 Timer 重新处理的相同问题:

// Add to the class body…
var i = 1
// Lazy initialization so the timer isn’t initialized until we call it
lazy var timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) {timer in
    guard self.i <= 20 else {
        timer.invalidate()
        return
    }

    self.label.text?.append(" another text")
    self.i += 1
}

// Add to the button action…
timer.fire()
于 2017-11-17T19:44:04.513 回答
0

如果我理解正确,您希望每个“文本”都延迟显示文本。您可以在此处使用递归。

1.将调度代码移动到方法中。2.删除for循环。3. 在 dispatch 它里面做你必要的动作。4.在调度中再次调用相同的方法。

请记住使用每次调用方法时递增的计数器变量。用它来中断递归。

于 2017-11-17T19:43:55.670 回答