2016-11-15 90 views
0

延遲的斯威夫特3約定:如何延遲Swift 3中的for循環?

func delay(_ delay: Double, closure: @escaping()->()){ 
    let when = DispatchTime.now() + delay 
    DispatchQueue.main.asyncAfter(deadline: when, execute: closure) 
} 

如果我把它叫做:

delay(1.0, closure: { 
         //Enter Code 
        }) 

這工作不同步,所以如果我把這個在for循環中,那麼它會在執行所有這些命令一次延遲後。

我在for循環中,像這樣:

for i in array{ 
    //I want to do a delay here 
     for j in i{ 
     //I also want to do a delay here 
     } 
    } 

的這點是我想那裏轉移到「J」的循環之前是第一個for循環中的延遲,那裏面「j」for循環,我想要一個延遲才能進入下一個J.

請幫忙,因爲這個Swift 3中的延遲函數是異步的。

+0

使用'的Thread.sleep(forTimeInterval:1.0)'代替''asyncAfter此 –

回答

0

在下面的代碼片段中,您的每個進程將在處理i和j的一段時間間隔後發生。所有進程都將以異步方式發生,所以不會發生任何問題。

for var i:Int in 10..<20 { 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: { 
    for var j:Int in 10..<20 { 
     DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2, execute: { 
     }) 
     j += 1 
    } 
}) 
i += 1 
} 

表示此for循環的另一種方式是使用stride

public func logger(logMessage: Any) { 
    print("\(Date()) \(logMessage)") 
} 

for var i in stride(from: 10, through: 20, by: 1) { 

    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: { 
     logger(logMessage: "i:\(i)") 
     for var j in stride(from: 30, through: 40, by: 1){ 
      DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2, execute: { 
       logger(logMessage: "j:\(j)") 
      }) 
     } 
    }) 
} 
+0

不起作用,打印出10 - 20所有在同一時間,這是現在我需要的,我需要它打印10,迭代和打印10 - 20在不同的時間,然後去11,做同樣的事情 –

+0

來http://chat.stackoverflow .com/rooms/127579/swift聊天,我們可以在那裏討論 –