1.GCD是蘋果提供的一個簡單、直接的能夠?qū)崿F(xiàn)線程操作的方案柴淘,需要和block配合使用迫淹,它是基于C的一套管理線程的方法,允許程序?qū)⑷蝿?wù)切分為多個單一任務(wù)然后提交至工作隊(duì)列來并發(fā)地或者串行地執(zhí)行悠就。
GCD中
隊(duì)列就是dispatch_queue_t 結(jié)構(gòu)體類型千绪。
隊(duì)列從類型上來看分串行(Serial)和并發(fā)(Concurrent)的充易。
區(qū)別在于串行必須要等一個(block)任務(wù)完成后梗脾,下一個(block)任務(wù)才開始進(jìn)行;并行則是無序的盹靴,不過兩者都是按順序向隊(duì)列里放任務(wù)進(jìn)去炸茧。
2.蘋果還單獨(dú)提供了一個主隊(duì)列(main quere)瑞妇,它也是一個串行隊(duì)列,與主線程關(guān)聯(lián)梭冠,用來處理UI相關(guān)的任務(wù)辕狰,主隊(duì)列并不用自己去創(chuàng)建的。
全局的幾個不同優(yōu)先級的隊(duì)列也可以直接獲取到
dispatch_async(dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@“碉堡控漠,我是異步并發(fā)的默認(rèn)優(yōu)先級線程");
});
3.如果自己需要特殊的隊(duì)列蔓倍,可以自定義串行隊(duì)列和并行隊(duì)列,根據(jù)參數(shù)區(qū)分盐捷,自己的線程自己維護(hù)偶翅,自己清理釋放。
第一個參數(shù)為queue的名稱碉渡,命名規(guī)則為應(yīng)用名稱ID的倒序+queue名字
第二個參數(shù)為 DISPATCH_QUEUE_SERIAL 或 Null 創(chuàng)建 串行隊(duì)列(Serial dispatch queue)
第二個參數(shù) 如果為DISPATCH_QUEUE_CONCURRENT 則創(chuàng)建的是并行隊(duì)列 (Concurrent queue)
dispatch_queue_t mySerialQueue = dispatch_queue_create("gcd.mySerialQueue", NULL);
dispatch_async(mySerialQueue, ^{
? ? NSLog(@"我的名字叫 gcd.mySerialQueue 聚谁,我是串行隊(duì)列");
});
dispatch_release(mySerialQueue);? //釋放
dispatch_queue_t myConcurrentQueue = ? ? ? ? ? ?dispatch_queue_create("gcd.myConcurrentQueue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConcurrentQueue, ^{
? ? ?NSLog(@"我的名字叫 gcd.myConcurrentQueue,我是并行隊(duì)列");
});
dispatch_release(myConcurrentQueue );? //釋放
4.向隊(duì)列中分派任務(wù)滞诺,可以以同步的方式進(jìn)行(dispatch_sync),也可以是異步的方式(dispatch_async)形导。
同步的方式會在分派任務(wù)時(shí)阻塞線程,直到任務(wù)結(jié)束习霹。因此考慮到這種死鎖的問題朵耕,同步盡量不用好。
異步的方式會在分派任務(wù)時(shí)淋叶,我們的block任務(wù)便會在開線程執(zhí)行憔披。