iOS - GCD 深入理解

如需轉(zhuǎn)載,請注明出處,尊重他人勞動(dòng),謝謝

GCD:Grand Central Dispatch (GCD)是Apple開發(fā)的一個(gè)多核編程的解決方法。是用C實(shí)現(xiàn)的,用起來很方便,而且很強(qiáng)大。

下面就來介紹GCD把。

1: 同步 和 異步 方法

1.1 同步? dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

第一個(gè)參數(shù):傳入一個(gè)隊(duì)列,會(huì)吧block 任務(wù)加入到隊(duì)列

第二個(gè)block: 是需要執(zhí)行的任務(wù)代碼

同步方法 沒有創(chuàng)建線程的能力;

1.2 異步 dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

參數(shù)跟同步方法一樣。但是異步方法有創(chuàng)建新線程的能力??!

2: 隊(duì)列

2.1 串行隊(duì)列

第一個(gè)參數(shù): 是個(gè)C 的 參數(shù),就一個(gè)C類型的字符串

第二個(gè)參數(shù):創(chuàng)建什么類型的隊(duì)列。DISPATCH_QUEUE_SERIAL 為串行

dispatch_queue_t quue =? dispatch_queue_create("com.joyfun.yg", DISPATCH_QUEUE_SERIAL);

2.2 并發(fā)隊(duì)列

參數(shù)跟上面一樣。DISPATCH_QUEUE_CONCURRENT 為并發(fā)隊(duì)列

dispatch_queue_t quue =? dispatch_queue_create("com.joyfun.yg", DISPATCH_QUEUE_CONCURRENT);

也可用下面的方法

第一個(gè)第二個(gè)參數(shù) 給定 0,0 ?就行了,不要管它

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

好了。2中方法2中隊(duì)列,那么有4種組合方式

3. 代碼。(不喜歡廢話,代碼先擼為敬)

3.1 異步+ 并發(fā)

看一下輸出結(jié)果吧:

看到了吧。number 是變動(dòng)的,2、3、4, 說明創(chuàng)建了線程哦,線程的創(chuàng)建個(gè)數(shù),由系統(tǒng)決定,看 a.b.c 是說明它是并發(fā)的哦,不是按照循序執(zhí)行的。

3.2 異步+ 串行

運(yùn)行起來:

注意到 number = 2 ?,創(chuàng)建了新線程了,再看a.b.c,是按照添加的循序執(zhí)行的,說明是串行的哦。

3.3 同步+并發(fā)

number =1 ,name=main, 是主線程啦。說明同步方法沒有能力創(chuàng)建線程,a、b、c是按照循序執(zhí)行的,說明 并發(fā) 只能在異步方法里面有效。

3.4 同步+ 串行

呀買碟。結(jié)果跟上面一樣。記住啦。

4. GCD延時(shí)

之前咱們調(diào)用延時(shí)方法老是用這個(gè)

[self performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#>]

是不是很low,來點(diǎn)高大上的GCD.

第一個(gè)參數(shù): 從什么時(shí)候開始,默認(rèn)的現(xiàn)在開始,不要管它

第二個(gè)參數(shù): 延時(shí)多久,給它個(gè)時(shí)間,秒

第三個(gè)參數(shù):在哪個(gè)隊(duì)列中執(zhí)行。默認(rèn)主隊(duì)列,可以根據(jù)你的需要修改

第四個(gè): 任務(wù),寫你需要做的事情

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

<#code to be executed after a specified delay#>

});

GCD延時(shí)


效果跟以前的performSelector 一樣吧。用起來

5. GCD Timer

以前用定時(shí)器喜歡用 NSTimer 去創(chuàng)建一個(gè) 定時(shí)器,那么現(xiàn)在可以用 GCD 定時(shí)器,精準(zhǔn)度很高。還有個(gè)很大的優(yōu)點(diǎn) : GCD定時(shí)器不受RunLoop約束,比NSTimer更加準(zhǔn)時(shí)。

GCD timer

就這么強(qiáng)大,簡單。

6. GCD 一次性函數(shù)

應(yīng)用場景: 單例。 表示只創(chuàng)建一次,不多說,很簡單

就寫到這兒,有時(shí)間再去跟新其它GCD幾個(gè)函數(shù).謝謝大家的閱讀,共同提高能力!歡迎老司機(jī)指點(diǎn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容