2013-07-30 88 views
0

可有人請我提供的,當你將使用信號量時使用DISPATCH_TIME_NOW VS DISPATCH_TIME_FOREVER的例子嗎?信號燈:DISPATCH_TIME_NOW VS DISPATCH_TIME_FOREVER

是什麼2之間和我會用什麼情況下,一個比其他的區別?

按照文檔DISPATCH_TIME_NOW裝置立即暫停。 DISPATCH_TIME_FOREVER表示超時無限。

爲什麼你想前者,即:立即暫停。

+3

您是指DISPATCH_TIME_NOW與DISPATCH_TIME_FOREVER? –

+0

呃,對不起。這是一個錯字。現在更正 – dubbeat

回答

4

您可以立即超時檢查,如果一個塊已完成計算。同樣,您可以永久等待,直到完成一個塊,然後繼續執行另一個塊。

如果一組完成看起來是這樣的檢查的一個例子。

if (dispatch_group_wait(myDispatchGroup, DISPATCH_TIME_NOW) == 0) { 
    // myDispatchGroup is finished... 
} else { 
    // myDispatchGroup is _not_ finished... 
} 

檢查一個組是否完成等待永久沒有意義,因爲該函數將永遠等待。相反,我們使用該功能來同步阻塞(在暫停或等待時阻塞,而不是在GCD塊中),直到組完成。

// Enqueue myDispatchGroup 

// Wait for it to finish 
dispatch_group_wait(myDispatchGroup, DISPATCH_TIME_FOREVER); 

// Do other work that depends on myDispatchGroup being completed 
+1

可以公平地說,DISPATCH_TIME_FOREVER用於組創建,而DISPATCH_TIME_NOW用於組查詢? – dubbeat

+1

我不會說羣體「創造」,因爲等待永遠做的一件很常見的事情是使用'dispatch_release(group);'釋放羣體。我會稱之爲組依賴關係。 –

+4

使調用「dispatch_group_wait(myDispatchGroup,DISPATCH_TIME_FOREVER);'是正確的做法的情況數量非常小。大多數時候這會阻止。阻塞主線程不好,阻塞GCD線程(可能)不好。使用'dispatch_group_notify'排隊一個塊,當你的組完成而不阻塞排隊線程時運行。 – ipmcc