对于循环等待和延迟-Swift 4

对于循环等待和延迟-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循环,我正试图使它这样,外部循环只会在内部循环及其代码完成后继续,并在执行下一个循环之前添加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
<代码>调度时间以纳秒为单位。以下是原型:

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”的含义感到困惑。太棒了。也正是我所需要的。