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

问题描述 投票:1回答:2

我有一个嵌套的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秒钟。

尝试了类似问题的其他答案,但似乎无法使其发挥作用。

swift for-loop delay wait
2个回答
2
投票

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

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操作都必须在主线程中完成


3
投票

asyncAfter()功能需要DispatchTimeDispatchTime是纳秒。以下是原型:

func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)

以下是docs from Apple Developer webpage的摘录:

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

要解决此问题,请使用:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1000) {}
© www.soinside.com 2019 - 2024. All rights reserved.