For 循环等待和延迟 - Swift 4
For Loop wait and delay - Swift 4
我有一个嵌套的 for 循环,我正在努力使外循环仅在内循环及其代码完成后继续,并在执行下一个循环之前添加 1 秒的延迟。
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
updateBoardArray()
printBoard()
// NEED TO WAIT HERE FOR 1 SEC
}
所以我不希望 0...3 For 循环仅在内部循环以及更新和打印函数完成其循环后才继续进行,并且还有 1 秒的等待时间。
目前这一切都立即发生,然后立即打印所有 4 个板,即使我在使用 DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now() + 1)时等待 1 秒也是如此{}.
已尝试过类似问题的其他答案,但似乎无法解决问题。
asyncAfter()
函数需要 DispatchTime
。 DispatchTime
以纳秒为单位。以下是原型:
func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
以下是 docs from Apple Developer webpage 的摘录:
DispatchTime represents a point in time relative to the default clock with nanosecond precision. On Apple platforms, the default clock is based on the Mach absolute time unit
要解决问题,请使用:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1000) {}
据我了解,您尝试执行的操作如下:
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
updateBoardArray()
printBoard()
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
}
这将不会工作,因为您正在做的是向主队列添加一个任务(什么都不做),该任务将在 1 秒后触发,并在添加它之后,代码继续执行 for,无需等待。
解决方案
您可以简单地使用 sleep(1)
,但请记住,这会冻结主线程(如果您在主线程中执行此操作)。
要避免冻结应用程序,您可以这样做:
DispatchQueue.global(qos: .default).async {
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
DispatchQueue.main.async {
updateBoardArray()
printBoard()
}
sleep(1)
}
}
}
请记住,您执行的任何 UI 操作都必须在主线程中完成
您可以使用 scheduledTimer:
for i in 0..3{
Timer.scheduledTimer(withTimeInterval: 0.2 * Double(i), repeats: false) { (timer) in
//CODE
}
}
有关 scheduledTimer 的更多信息。
我有一个嵌套的 for 循环,我正在努力使外循环仅在内循环及其代码完成后继续,并在执行下一个循环之前添加 1 秒的延迟。
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
updateBoardArray()
printBoard()
// NEED TO WAIT HERE FOR 1 SEC
}
所以我不希望 0...3 For 循环仅在内部循环以及更新和打印函数完成其循环后才继续进行,并且还有 1 秒的等待时间。
目前这一切都立即发生,然后立即打印所有 4 个板,即使我在使用 DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now() + 1)时等待 1 秒也是如此{}.
已尝试过类似问题的其他答案,但似乎无法解决问题。
asyncAfter()
函数需要 DispatchTime
。 DispatchTime
以纳秒为单位。以下是原型:
func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
以下是 docs from Apple Developer webpage 的摘录:
DispatchTime represents a point in time relative to the default clock with nanosecond precision. On Apple platforms, the default clock is based on the Mach absolute time unit
要解决问题,请使用:
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1000) {}
据我了解,您尝试执行的操作如下:
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
updateBoardArray()
printBoard()
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
}
这将不会工作,因为您正在做的是向主队列添加一个任务(什么都不做),该任务将在 1 秒后触发,并在添加它之后,代码继续执行 for,无需等待。
解决方案
您可以简单地使用 sleep(1)
,但请记住,这会冻结主线程(如果您在主线程中执行此操作)。
要避免冻结应用程序,您可以这样做:
DispatchQueue.global(qos: .default).async {
for _ in 0...3 {
for player in 0...15 {
// CODE ADDING MOVEMENTS TO QUEUE
}
DispatchQueue.main.async {
updateBoardArray()
printBoard()
}
sleep(1)
}
}
}
请记住,您执行的任何 UI 操作都必须在主线程中完成
您可以使用 scheduledTimer:
for i in 0..3{
Timer.scheduledTimer(withTimeInterval: 0.2 * Double(i), repeats: false) { (timer) in
//CODE
}
}
有关 scheduledTimer 的更多信息。