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() 函数需要 DispatchTimeDispatchTime 以纳秒为单位。以下是原型:

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 的更多信息。