GCD,大家都知道的回顾
GCD,自iOS4.0吧,比block還要早,他的用處主要是體現(xiàn)在線程方面,比如你有個比較麻煩的而且循環(huán)比較大的代碼段什么,比如有個后臺下載什么的,這都必須放在子線程里一個放在子線程里執(zhí)行,為了不影響用戶體驗!
來說說幾個很基本的東西方便了解:
串行
系統(tǒng)默認就有一個串行隊列main_queue,也就是主線程所在的隊列,因為是串行,所以可以認為通過這個回到主線程
自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_CONCURRENT);(queueName 自定義的串行隊列的名稱)
執(zhí)行一般是dispatch_get_main_queue()
?
?
并行
系統(tǒng)默認就有一個并行隊列g(shù)lobal_queue
自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_SERIAL);
關(guān)于并行,有個優(yōu)先級的問題,看看系統(tǒng)給的,2,0 ,-2 和最小。。。
?
#define DISPATCH_QUEUE_PRIORITY_HIGH?2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT?0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN
執(zhí)行一般是dispatch_get_global_queue(這里是填優(yōu)先級, 這個值可以看說明默認是0);
?
一般經(jīng)常干的事是什么呢
dispatch_async(這里是并發(fā), ^{
??// long-running task code?here
? ? ? ? dispatch_async(這里是串行,^{
//update UI code here
});
??? });
線程的延時操作
dispatch_time(DISPATCH_TIME_NOW(這個是以程序執(zhí)行的時間點), seconds * NSEC_PER_SEC(這里是設(shè)定精確級別的));
dispatch_after(dispatch_time_t when(這個就是上面生成的一個time),dispatch_queue_t queue(隊列),dispatch_block_t block(延遲執(zhí)行的語句));
線程組
dispatch_group_create()創(chuàng)建一個組
可以用來監(jiān)控一個group里的內(nèi)容是否執(zhí)行完成
dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
很奇特的GCD,不是么,group是一個個執(zhí)行的,但是在這其中,不管你是并行或串行,根本就不會按你所想的規(guī)矩來,特別是并發(fā)的,當你加入一個group里面他可不會按你代碼排的順序來執(zhí)行(包括串行),但是最終肯定會執(zhí)行dispatch_group_notify參數(shù)里面的block語句。
GCD定時器
寫成一個內(nèi)聯(lián)函數(shù)
NS_INLINE dispatch_source_t GCD_create_timer(int64_t seconds, dispatch_queue_t queue, void (^block)(dispatch_source_t timer))
{
??? //創(chuàng)建Timer
???
??? dispatch_source_t _timer?=dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
?? ?
??? //使用dispatch_source_set_timer函數(shù)設(shè)置timer參數(shù)
??? dispatch_source_set_timer(_timer,
????????????????????????????? dispatch_time(DISPATCH_TIME_NOW, 0),
????????????????????????????? seconds * NSEC_PER_SEC,
????????????????????????????? 0);
?? ?
??? //設(shè)置回調(diào)
??? dispatch_source_set_event_handler(_timer, ^(){
????????????????????????????????????????? block(_timer);
????????????????????????????????????? });
?? ?
??? //dispatch_source默認是Suspended狀態(tài),通過dispatch_resume函數(shù)開始它
??? dispatch_resume(_timer);
??? return _timer;
}
用完記得釋放,否則。。。。(ARC可以不考慮,看看里面的實現(xiàn)吧!)
?
至于同步的。。。你覺得這有討論的必要么,好吧,我確實不知道同步用在那些地方!
?
轉(zhuǎn)載于:https://www.cnblogs.com/lingzhiguiji/p/3709592.html
總結(jié)
以上是生活随笔為你收集整理的GCD,大家都知道的回顾的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UML类图详解及rose中的画法
- 下一篇: 苹果序列号查询教程,鉴别手机真伪!