2011-12-08 236 views
1

下面是一個示例函數,我嘗試運行一個主組,等待,然後在單獨的線程上運行兩個其他後臺任務,然後等待,然後返回在下面顯示的常規塊中更改的值。以下顯示的是我如何做到這一點的猜測。如果我在一個塊中全部運行這些塊,它就可以工作。當我分開塊時它失敗。有沒有人有他們如何完成類似的事情的例子?在此先感謝您的幫助。Grand Central Dispatch。如何運行一個異步組,等待,然後運行另一個,再等待,然後完成?

-(NSString *)sampleFunction:(NSString*)inputString 
{ 
__block NSString *returnString; 

dispatch_group_t mainGroup = dispatch_group_create(); 
dispatch_group_t otherGroup = dispatch_group_create(); 

void (^firstBlock)(void) = ^(void) 
{ 
    ... 
}; 

void (^secondBlock)(void) = ^(void) 
{ 
    ... 
}; 


void (^thirdBlock)(void) = ^(void) 
{ 
    ... 
}; 

dispatch_group_async(oneGroup, dispatch_get_global_queue(0, 0), firstBlock); 

dispatch_group_wait(oneGroup, sizeof(int)); 

dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), secondBlock); 
dispatch_group_async(otherGroup, dispatch_get_global_queue(0, 0), thirdBlock); 

dispatch_group_wait(otherGroup, sizeof(int)); 

dispatch_release(userGroup); 
dispatch_release(otherGroup); 

return returnString; 
} 
+1

請解釋一下大圖,你想完成什麼?我沒有得到等待的部分。 – DarkDust

+1

爲什麼你將'sizeof(int)'作爲參數傳遞給'dispatch_group_wait'?你知道'DISPATCH_TIME_FOREVER'? – DarkDust

+1

爲什麼不直接執行一個線程上的所有代碼?如果你正在等待線程完成,那麼即使有線程有什麼意義? –

回答

4

有很多不同的方法可以做到這一點,但最簡單的(或至少是明顯的)方法是爲您的「管道」的每個階段創建一個組,然後爲組A調度完成回調對B組的工作也有一個完成回調,安排C組的工作。

這裏的關鍵不是實際等待組完成 - 這是不必要的。當組中的最後一個塊完成時,組可以有自動運行的完成塊(參見dispatch_group_notify()),這是創建「粉絲進入」點的好方法,在這裏你已經發現了一些工作組。

7

dispatch_semaphore是你的朋友在這裏。 :-)

/* Create your semaphore with 0 */ 
dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

/* wait on the semaphore, causes your second & third queue to wait */ 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

/* At the end of your first queue finishing, signal the semaphore waiting in 
    the 2nd queue to take over */ 
dispatch_semaphore_signal(sema); 

如果你想要一個更簡單的解決方案,只需使用dispatch_apply(它爲您的旗語工作),而不是這些團體的,雖然不能完全確定您使用的團體爲了什麼。

+0

感謝您的快速回復。我會盡快嘗試,並在我遇到成功的時候回覆你並投票選出正確的答案:) – banDedo

相關問題