对于循环等待和延迟-Swift 4
我有一个嵌套的for循环,我正试图使它这样,外部循环只会在内部循环及其代码完成后继续,并在执行下一个循环之前添加1秒的延迟对于循环等待和延迟-Swift 4,swift,for-loop,delay,wait,Swift,For Loop,Delay,Wait,我有一个嵌套的for循环,我正试图使它这样,外部循环只会在内部循环及其代码完成后继续,并在执行下一个循环之前添加1秒的延迟 for _ in 0...3 { for player in 0...15 { // CODE ADDING MOVEMENTS TO QUEUE } updateBoardArray() printBoard() // NEED TO WAIT HERE FO
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
<代码>调度时间以纳秒为单位。以下是原型:
func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
以下为摘录:
DispatchTime表示相对于默认时钟的时间点,精度为纳秒。在苹果平台上,默认时钟基于马赫绝对时间单位
要解决此问题,请使用:
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操作都必须在主线程中执行现在使用
.now()+.seconds(1)
更清晰了。否则,人们很容易对“1000”的含义感到困惑。太棒了。也正是我所需要的。