GCD,自iOS4.0吧,比block還要早,他的用處主要是體現在線程方面,比如你有個比較麻煩的而且循環比較大的代碼段什么,比如有個后臺下載什么的,這都必須放在子線程里一個放在子線程里執行,為了不影響用戶體驗!
來說說幾個很基本的東西方便了解:
串行
系統默認就有一個串行隊列main_queue,也就是主線程所在的隊列,因為是串行,所以可以認為通過這個回到主線程
自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_CONCURRENT);(queueName 自定義的串行隊列的名稱)
執行一般是dispatch_get_main_queue()
?
?
并行
系統默認就有一個并行隊列global_queue
自定義dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8StringEncoding],
??????????????????????????? DISPATCH_QUEUE_SERIAL);
關于并行,有個優先級的問題,看看系統給的,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
執行一般是dispatch_get_global_queue(這里是填優先級, 這個值可以看說明默認是0);
?
一般經常干的事是什么呢
dispatch_async(這里是并發, ^{
??// long-running task code?here
? ? ? ? dispatch_async(這里是串行,^{
//update UI code here
});
??? });
線程的延時操作
dispatch_time(DISPATCH_TIME_NOW(這個是以程序執行的時間點), seconds * NSEC_PER_SEC(這里是設定精確級別的));
dispatch_after(dispatch_time_t when(這個就是上面生成的一個time),dispatch_queue_t queue(隊列),dispatch_block_t block(延遲執行的語句));
線程組
dispatch_group_create()創建一個組
可以用來監控一個group里的內容是否執行完成
dispatch_group_notify(dispatch_group_t group,
dispatch_queue_t queue,
dispatch_block_t block);
很奇特的GCD,不是么,group是一個個執行的,但是在這其中,不管你是并行或串行,根本就不會按你所想的規矩來,特別是并發的,當你加入一個group里面他可不會按你代碼排的順序來執行(包括串行),但是最終肯定會執行dispatch_group_notify參數里面的block語句。
GCD定時器
寫成一個內聯函數
NS_INLINE dispatch_source_t GCD_create_timer(int64_t seconds, dispatch_queue_t queue, void (^block)(dispatch_source_t timer))
{
??? //創建Timer
???
??? dispatch_source_t _timer?=dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
?? ?
??? //使用dispatch_source_set_timer函數設置timer參數
??? dispatch_source_set_timer(_timer,
????????????????????????????? dispatch_time(DISPATCH_TIME_NOW, 0),
????????????????????????????? seconds * NSEC_PER_SEC,
????????????????????????????? 0);
?? ?
??? //設置回調
??? dispatch_source_set_event_handler(_timer, ^(){
????????????????????????????????????????? block(_timer);
????????????????????????????????????? });
?? ?
??? //dispatch_source默認是Suspended狀態,通過dispatch_resume函數開始它
??? dispatch_resume(_timer);
??? return _timer;
}
用完記得釋放,否則。。。。(ARC可以不考慮,看看里面的實現吧!)
?
至于同步的。。。你覺得這有討論的必要么,好吧,我確實不知道同步用在那些地方!
?