2016-11-15 100 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聊天,我们可以在那里讨论 –