2017-04-09 66 views
-2

沒有影響預期的行爲:爲什麼把一個DispatchQueue延遲功能的另一DispatchQueue裏面有斯威夫特

對於i = 0,0之後稱爲第二打印語句。

對於i = 1,打印語句1.1秒

2.2秒

後,對於i = 2,稱爲打印語句之後稱爲

實際行爲:後0,1,2稱爲

打印語句,分別爲3秒,即內部延遲功能被忽略。

那麼爲什麼這種差異?

for i in 0...3 { 

     DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(i), execute: { 

      DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(i/10), execute: { 
       print("function was called") 
      })  
     }) 
    } 
+0

但是什麼是_question_?你希望做什麼? – matt

+0

要讓它每隔一秒鐘執行一次打印語句 –

+0

那麼,你的代碼不會這麼做; 'for in 0 ... 5'執行所有循環_immediately_。 – matt

回答

0

有很多方法可以做到這一點。這裏有3條:

使用計時器重複

var i = 0 
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in 
    i += 1 
    print("hello \(i)") 
    if i == 5 { 
     timer.invalidate() 
    } 
} 

調度多個異步任務

for i in 1...5 { 
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(i)) { 
     print("hello \(i)") 
    } 
} 

注意一個塊中每隔:此隊列中的所有任務前面和如果有大量隊列可能會溢出隊列。

在背景與睡眠,並切換到前臺運行循環打印

DispatchQueue.global().async { 
    for i in 1...5 { 
     sleep(1) 
     DispatchQueue.main.async { 
      print("hello \(i)") 
     } 
    } 
} 

注意:這將漂移一點(不間隔1秒),如果在循環中的工作需要的顯著量時間。

+0

您的第二個解決方案非常適合我的真實目的,謝謝! –