2012-06-05 108 views
1

它很容易耽誤執行這樣的事情多dispatch_after不能很好地工作

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 

但它會使上面的代碼無法執行,如果把另一個較長的延遲像

double delayInSeconds2 = 3.0; 
dispatch_time_t popTime2 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds2 * NSEC_PER_SEC); 
dispatch_after(popTime2, dispatch_get_main_queue(), ^(void){ 
    <#code to be executed on the main queue after delay#> 
}); 

爲什麼只執行更長的一個,而不是兩個?還是我完全錯了?

+0

當我測試時,它的工作原理如下:2秒後,頂部一個被執行。接下來的1,(3-2),第二,底部代碼得到執行。然而,底層代碼在開始之前確實需要等待頂層代碼完成(如果頂層代碼需要超過1秒才能完成)。 – user523234

+0

我可以理解它不符合您的預期嗎? – Forrest

+0

最初我以爲這是一個串行隊列。但是我通過設置delayInSeconds2 = 1.0和第二個代碼首先執行了另一個測試。所以這些是獨立的。我的解釋是,它允許您安排多個dispatch_after,但這些隊列本質上是同步的。 – user523234

回答

0

它是一個隊列,但位置取決於未來的射擊時間而不是排隊時間。

如果第二個是1秒,它將在第一個之前插入。

如果您希望它們同時執行(單核的時間片或多核cpu的實時併發),請將它們放在不同的隊列中。

相關問題