dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 匯總結果
});
==========================
關於gcd 和 nsoperation
GCD和NSOperation的區別
1、GCD是一種輕量級的方法來實現多線程。控制起來比較麻煩,比如取消和暫停一個線程。
2、NSOperation和NSOperationQueue相對於GCD效率上要低一點,他們是面向對象的方式,從Mac OS X v10.6和iOS4開始,NSOperation底層也是用的GCD來實現的。可以在多個操作中添加附屬,也可以重用操作,取消或者暫停。NSOperation和KVO是兼容,也就是說,可以在NSOperation中使用KVO,例如,你可以通過NSNotificationCenter去讓一個操作開始執行。
3、NSOperation的使用方法
【1】、繼承NSOperation類
【2】、重寫“main”方法
【3】、在“main”方法中創建一個autoreleasepool
【4】、將自己的代碼放在autoreleasepool中
注意:創建自動釋放池的原因是,你不能訪問主線程的自動釋放池,所以需要自己創建一個。
4、NSOperation的常用方法
【1】、start:開始方法,當把NSOperation添加到NSOperationQueue中去后,隊列會在操作中調用start方法。
【2】、addDependency,removeDependency:添加從屬性,刪除從屬性,比如說有線程a,b,如果操作a從屬於b,那么a會等到b結束后才開始執行。
【3】、setQueuePriority:設置線程的優先級。例:[a setQueuePriority:NSOperationQueuePriorityVeryLow];一共有四個優先級:NSOperationQueuePriorityLow,NSOperationQueuePriorityNormal,NSOperationQueuePriorityHigh,NSOperationQueuePriorityVeryHigh。
當你添加一個操作到一個隊列時,在對操作調用start之前,NSOperationQueue會瀏覽所有的操作,具有較高優先級的操作會優先執行,具有相同優先級的操作會按照添加到隊列中順序執行。
【4】、setCompletionBlock:設置回調方法,當操作結束后,會調用設置的回調block。這個block會在主線程中執行。
說法二
GCD是基於c的底層api,NSOperation屬於object-c類。ios 首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue並且其內部是用gcd實現的。
相對於GCD:
1,NSOperation擁有更多的函數可用,具體查看api。
2,在NSOperationQueue中,可以建立各個NSOperation之間的依賴關系。
3,有kvo,可以監測operation是否正在執行(isExecuted)、是否結束(isFinished),是否取消(isCanceld)。
4,NSOperationQueue可以方便的管理並發、NSOperation之間的優先級。
GCD主要與block結合使用。代碼簡潔高效。
GCD也可以實現復雜的多線程應用,主要是建立個個線程時間的依賴關系這類的情況,但是需要自己實現相比NSOperation要復雜。
具體使用哪個,依需求而定。 從個人使用的感覺來看,比較合適的用法是:除了依賴關系盡量使用GCD,因為蘋果專門為GCD做了性能上面的優化。