我有一个嵌套的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>
尝试过类似问题的其他答案,但似乎无法使其发挥作用。
答案 0 :(得分:3)
asyncAfter()
函数需要DispatchTime
。 DispatchTime
是纳秒。以下是原型:
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操作都必须在主线程中完成