GCD
1、創(chuàng)建GCD任務的方式有
1搔涝、dispatch_async(異步執(zhí)行)
2厨喂、dispatch_sync (同步執(zhí)行)
2、創(chuàng)建GCD任務時需要加入到隊列中執(zhí)行庄呈。GCD中的隊列有
1杯聚、串行隊列
2、并行隊列
3抒痒、主隊列 (GCD自帶的一種特殊的串行隊列)
幌绍。所有放在主隊列中的任務,都會放到主線程中執(zhí)行
故响】悖可使用dispatch_get_main_queue()獲得主隊列
3、創(chuàng)建GCD有6種不同的組合方式
1彩届、同步執(zhí)行 + 串行隊列? (不會開啟新線程伪冰,在當前線程執(zhí)行任務。任務是串行的樟蠕,執(zhí)行完一個任務贮聂,再執(zhí)行下一個任務。)
2寨辩、同步執(zhí)行 + 并行隊列 (特點:在當前線程中執(zhí)行任務吓懈,不會開啟新線程,執(zhí)行完一個任務靡狞,再執(zhí)行下一個任務耻警。)
3、同步執(zhí)行 + 主隊列 (同步執(zhí)行 + 主隊列在不同線程中調用結果也是不一樣甸怕,在主線程中調用會出現死鎖甘穿,而在其他線程中則不會。在其他線程中梢杭,不會開啟新線程温兼,執(zhí)行完一個任務,再執(zhí)行下一個任務)
4武契、異步執(zhí)行 + 串行隊列? ?(會開啟新線程募判,但是因為任務是串行的缸榛,執(zhí)行完一個任務,再執(zhí)行下一個任務)
5兰伤、異步執(zhí)行 + 并行隊列 ( 特點:可以開啟多個線程内颗,任務交替(同時)執(zhí)行。)
6敦腔、異步執(zhí)行 + 主隊列? ?(只在主線程中執(zhí)行任務均澳,執(zhí)行完一個任務,再執(zhí)行下一個任務符衔。)
異步執(zhí)行一個串行隊列的時候找前,開啟一個新線程01,多次調用后判族,只在新線程01內執(zhí)行躺盛。
異步一個并行隊列,開啟一個新的線程01形帮,多次調用后槽惫,開啟不同的新線程02,線程03.....辩撑。
同步執(zhí)行一個串行隊列時界斜,沒有開啟新線程,如果在queue所在的線程上開啟會造成死鎖合冀。
同步一個并行隊列各薇,沒有開啟新線程。
4君躺、GCD的其他方法
4.1峭判、dispatch_apply GCD 快速迭代方法
通常我們會用 for 循環(huán)遍歷,但是 GCD 給我們提供了快速迭代的函數dispatch_apply棕叫。dispatch_apply按照指定的次數將指定的任務追加到指定的隊列中林螃,并等待全部隊列執(zhí)行結束。
dispatch_queue_t applyQueue = dispatch_queue_create("com.laxton.applyQueue", DISPATCH_QUEUE_CONCURRENT);
? ? size_tcount =10;
? ? //如果是串行隊列循環(huán)執(zhí)行全部在主線程上谍珊。如果在并發(fā)隊列中開啟新的線程循環(huán)執(zhí)行治宣。
? ? dispatch_apply(count, applyQueue, ^(size_ti) {
? ? ? ? NSLog(@"循環(huán)執(zhí)行第%li次 %@",i,[NSThreadcurrentThread]);
? ? });
4.2?GCD 柵欄方法:dispatch_barrier_async
在執(zhí)行完柵欄前面的操作之后急侥,才執(zhí)行柵欄操作砌滞,最后再執(zhí)行柵欄后邊的操作。
4.3?dispatch_group_wait
暫停當前線程(阻塞當前線程)坏怪,等待指定的 group 中的任務執(zhí)行完成后贝润,才會往下繼續(xù)執(zhí)行。
4.4??dispatch_group_enter铝宵、dispatch_group_leave
從dispatch_group_enter打掘、dispatch_group_leave相關代碼運行結果中可以看出:當所有任務執(zhí)行完成之后华畏,才執(zhí)行 dispatch_group_notify 中的任務。這里的dispatch_group_enter尊蚁、dispatch_group_leave組合亡笑,其實等同于dispatch_group_async。
作者:行走的少年郎
鏈接:http://www.reibang.com/p/2d57c72016c6
來源:簡書
著作權歸作者所有横朋。商業(yè)轉載請聯系作者獲得授權仑乌,非商業(yè)轉載請注明出處。
NSOperation
系統提供兩種Operation
1琴锭、NSInvocationOperation 加入隊列后開啟新線程執(zhí)行任務
NSInvocationOperation*invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(loadImageSource:)object:@"imageUrl"];
? ? NSOperationQueue *queue = [[NSOperationQueue alloc] init];
? ? [queueaddOperation:invocationOperation];
2晰甚、NSBlockOperation?加入隊列后開啟新線程執(zhí)行任務
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
? ? ? ? [self loadImageSource:@"www."];
? ? }];
? ? [queueaddOperation:blockOperation];
NSOperation 與 CGD相比
1、可以設置兩個任務之間的依賴
2决帖、可以設置一個任務在隊列中的優(yōu)先級
3厕九、可以設置隊列的最大并發(fā)數。(允許同時進行幾個任務)
NSThread
優(yōu)點:
1地回、(有幾個屬性BOOL executing扁远,BOOL?finished,BOOL cancelled)可以檢查到線程的狀態(tài)刻像。
2穿香、(有方法 - (void)cancel,- (void)start绎速, + (void)exit;)來操作線程開始和取消跟退出皮获。
3、輕量級纹冤,是真正的多線程洒宝。
4、(+ (BOOL)setThreadPriority:(double)p;)可以設置線程優(yōu)先級萌京。
缺點:
1雁歌、要自己手動管理線程生命周期,不支持多核知残。
CGD
優(yōu)點:
支持多核靠瞎,高效,使用簡便不需要管理線程周期
缺點:
1求妹、不能檢測到線程狀態(tài)乏盐。
2、不能設置線程優(yōu)先級制恍。
3父能、線程數不可控。
NSOperation
優(yōu)點:
1净神、(有屬性:BOOL cancelled何吝,BOOL executing溉委,BOOL finished)可以檢測到任務的狀態(tài)。
2爱榕、(有方法- (void)cancel瓣喊,如果你的操作已經執(zhí)行,它不會讓你的任務立即停止黔酥,只是更新任務的內部標志型宝,如果操作還沒有執(zhí)行,則取消隊列里的操作絮爷,如果操作已經完成趴酣,則此方法沒有任何效果)
3、(有方法- (void)addDependency:(NSOperation*)op;- (void)removeDependency:(NSOperation*)op;)添加依賴刪除依賴坑夯。)
4岖寞、(有屬性NSOperationQueuePriority queuePriority;)可以設置操作優(yōu)先級
5、(可以添加到NSOperationQueue中實現并發(fā)執(zhí)行柜蜈,NSOperationQueue 屬性maxConcurrentOperationCount可以設置可以同時執(zhí)行的最大操作數)
缺點:
是抽象類仗谆,要創(chuàng)建子類才能使用。