For 循环等待和延迟 - Swift 4

chi*_*688 4 for-loop delay wait swift

我有一个嵌套的 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
    }
Run Code Online (Sandbox Code Playgroud)

所以我不希望 0...3 For 循环仅在内部循环和更新和打印功能完成其循环以及 1 秒的等待时间后才进行。

目前,这一切都同时发生,然后立即打印所有 4 个板,即使我使用 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {} 等待 1 秒。

已经尝试过类似问题的其他答案,但似乎无法让它发挥作用。

nik*_*ano 8

据我了解,您尝试做的是以下内容:

for _ in 0...3 {
   for player in 0...15 {
     // CODE ADDING MOVEMENTS TO QUEUE
   }

   updateBoardArray()
   printBoard()

   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
}
Run Code Online (Sandbox Code Playgroud)

这将工作,因为你在做什么是一个任务(会做什么)添加到将在1秒钟后得到触发的主队列,并将其添加后,代码继续使用的,无需等待。

解决方案

您可以做的只是使用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)

            }
        } 
   }
Run Code Online (Sandbox Code Playgroud)

请记住,您所做的任何 UI 操作都必须在主线程中完成


cse*_*cse 5

asyncAfter()函数需要DispatchTime. DispatchTime以纳秒为单位。以下是原型:

func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
Run Code Online (Sandbox Code Playgroud)

以下是来自 Apple Developer 网页文档摘录:

DispatchTime 表示相对于具有纳秒精度的默认时钟的时间点。在 Apple 平台上,默认时钟基于马赫绝对时间单位

要解决此问题,请使用:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1000) {}
Run Code Online (Sandbox Code Playgroud)

  • 现在使用`.now() + .seconds(1)` 更加清晰。否则很容易混淆“1000”的含义。 (7认同)