我试图通过延迟来循环(仅作为概念证明)这是为了别的东西。但为了简化它,这是一个例子。
所以在这个例子中,我有一个带有“text”的字符串,我想循环添加另一个字符串,让我们说10次。唯一的问题是我希望每次迭代都有延迟。到目前为止,这是我的代码。
//全局变量
var myString =“text”
//按钮内的动作
let delayInSeconds = 1.0
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) {
for _ in 1...10 {
self.myString += "another text"
}
}
labelOne.text = myString
}
我应该补充说,结果是所有10个“另一个文本”立即被添加而没有任何延迟。
谢谢
答案 0 :(得分:2)
在您的示例中,您将字符串在同一工作单元中追加十次。尝试每个循环调度一次:
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()
答案 1 :(得分:0)
如果我理解正确,您希望逐个显示文本,并为每个“文本”延迟。 你可以在这里使用递归。
1.将调度代码移动到方法中。 2.删除for循环。 3.在发送内部进行必要的操作。 4.再次在调度内调用相同的方法。
请记住使用每次调用方法时递增的计数器变量。用它来打破递归。