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

时间:2018-03-01 15:20:09

标签: 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 FOR 1 SEC
    }

所以我不想0 ... 3 For循环仅在内循环和更新和打印功能完成循环后进行,并且还有1秒的等待时间。

此刻一切都发生,然后立即打印所有4个板,即使我在使用DispatchQueue.main.asyncAfter(截止日期:DispatchTime.now()+ 1){}时等待1秒钟。 / p>

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

2 个答案:

答案 0 :(得分:3)

asyncAfter()函数需要DispatchTimeDispatchTime是纳秒。以下是原型:

func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)

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

  

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

要解决此问题,请使用:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1000) {}

答案 1 :(得分:2)

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

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

   updateBoardArray()
   printBoard()

   DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {}
}

这将 NOT 工作,因为你正在做的是向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)

            }
        } 
   }

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