GCD 就是蘋果給我們封裝好的異步執(zhí)行的代碼~
蘋果官方對GCD的說明:開發(fā)者只需要定義想執(zhí)行的任務(wù)并追加到適當(dāng)?shù)腄ispatch Queue中。
dispatch_async(queue, ^{
//想要做的事
})
Dispatch Queue 就是執(zhí)行處理的等待隊列洽故,按照FIFO先進先出的順序執(zhí)行
并且Dispatch Queue還分為兩種:
- Serial Dispatch Queue 即只使用單線程,執(zhí)行完成的順序和執(zhí)行順序一致---串行隊列
- Concurrent Dispatch Queue 多個線程一起執(zhí)行杀餐。執(zhí)行完成的順序和執(zhí)行順序不一致---并行隊列
創(chuàng)建隊列:
串行隊列:
dispatch_queue_t serialQueue = dispatch_queue_create
("info.byhuang.SerialQueue", DISPATCH_QUEUE_SERIAL);
//可以是使用NULL代替DISPATCH_QUEUE_SERIAL 詳情可以看這個宏的定義
* 并行隊列:
* ```
dispatch_queue_t concurrentQueue = dispatch_queue_create
("info.byhuang.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
創(chuàng)建出來的是不是串行或并行裙盾,大家可以自己測試一下即可
當(dāng)然系統(tǒng)也為我們提供了幾個不同優(yōu)先級的并行隊列,讓我們可以快速使用:
//優(yōu)先級最高隊列- 并行
dispatch_queue_t globalHighQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
//默認優(yōu)先級
dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//低優(yōu)先級
dispatch_queue_t globalLowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
//后臺運行
dispatch_queue_t globalBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
在前面我們自己創(chuàng)建的隊列也是有優(yōu)先級的郎任,它的默認優(yōu)先級是default
秧耗,如果
我們想要修改它的優(yōu)先級就需要使用<b>target_queue</b>
//自定義一個隊列
dispatch_queue_t highQueue = dispatch_queue_create("info.byhuang.highQueue", DISPATCH_QUEUE_CONCURRENT);
//變更隊列的優(yōu)先級
dispatch_set_target_queue(highQueue, globalHighQueue);
如果我們需要在固定的時間之后把某個操作假如到隊列中怎么辦呢?沒關(guān)系已經(jīng)有現(xiàn)成的可以用啦~~ dispatch_after
舶治,就可以幫你解決!
//ull是c語言的數(shù)值字面量
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*3ull);
dispatch_after(time, highQueue, ^{
NSLog(@"Hi byhuang ");
});
但是要注意dispatch_after
>不是在指定事件執(zhí)行而是在指定時間之后加入到隊列中分井,所以等待時間會大雨等于time。因為有可能隊列中任務(wù)有很多啊霉猛,我們在三秒中之后只是加入到隊列中尺锚,還沒有算等待的時間呢
;
需要在隊列中任務(wù)執(zhí)行完之后再執(zhí)行某個任務(wù)的時候就要用到dispatch_group
dispatch_group_t group = dispatch_group_create();
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"全部執(zhí)行完了");
});
//需要配合 dispatch_group_async使用加入到group中
dispatch_group_async(group, highQueue, ^{
NSLog(@"111zz");
});
group中可以包含有不同隊列中的任務(wù)。只有把任務(wù)加入到group中惜浅。當(dāng)任務(wù)執(zhí)行完就會調(diào)用dispatch_group_notify
來執(zhí)行我們所追加的任務(wù)了瘫辩,怎么樣是不是很簡單~
還有一種當(dāng)單個隊列中任務(wù)執(zhí)行完成之后再執(zhí)行某個任務(wù)的方法dispatch_barrier_async
//使用dispatch_barrier_async用來在并行隊列都執(zhí)行完之后,再執(zhí)行的操作.
dispatch_barrier_async(concurrentQueue, ^{
//全部執(zhí)行完再執(zhí)行
NSLog(@"2");
});
dispatch_sync:同步執(zhí)行坛悉,不執(zhí)行完不會返回返回結(jié)果杭朱。極其容易造成死鎖吹散,所以我們盡量避免使用弧械,尤其是在主線程中!
dispatch_apply:根據(jù)次數(shù)來向主線程中添加幾次操作空民。
dispatch_suspend:掛起指定的線程
dispatch_resume:恢復(fù)指定的線程
//同步的--在主線程中千萬不要使用刃唐,否則會造成卡死
dispatch_sync(concurrentQueue, ^{
NSLog(@"byhuang");
});
//根據(jù)次數(shù)來指定羞迷,向隊列中添加幾次操作
dispatch_apply(3, concurrentQueue, ^(size_t index) {
NSLog(@"添加三次");
});
//指定掛起的隊列
dispatch_suspend(concurrentQueue);
//恢復(fù)指定的隊列
dispatch_resume(concurrentQueue);
我想上面這些操作已經(jīng)足夠我們的平常使用,最后一起學(xué)習(xí)共勉~
我的個人博客地址byhuang的技術(shù)博客
和簡書一起同步更新~~