主線程:UI線程, 顯示、刷新UI界面,處理UI控件的事件安全
2、線程同步併發
1.實質:爲防止多個線程搶奪同一個資源在成的數據安全問題異步
2.實現:給代碼加一個互斥鎖。async
3、GCD函數
1.隊列和任務spa
1>任務:須要執行什麼操做 用block來封裝任務線程
2>隊列存聽任務code
全局併發隊列:能夠讓任務併發執行orm
dispatch_queue_t queue = dispatch_global_queue(IDSPATCH_QUEUE_PRIORITY_DEFAULT,0);隊列
本身建立的串行隊列:讓任務一個接一個執行
dispatch_queue_t queue = dispatch_queue_create("cn.yan.queue",NULL);
主隊列:讓任務在主線程執行
dispatch_queue_t queue = dispatch_get_main_queue();
2.執行任務的函數
1》同步執行:不具有開啓新線程的能力
dispatch_sync
2》異步執行:具有開啓新線程的能力
dispatch_async
3.常見組合
1>dispatch_async +全局併發隊列
2>dispatch_async+本身建立的串行隊列
4.線程間的通訊(掌握)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
全局併發隊列 執行耗時的異步操做
dispatch_async(dispatch_get_main_queue(),^{
回到主線程,執行UI刷新操做
});
});
5.GCD的全部的API都在libdispatch.dylib,Xcode會自動導入這個庫
主頭文件:#import <dispatch/dispatch.h>
6.延遲執行
1》perform 3秒後自定回到當前線程調用self的download:方法,並傳遞參數
[self performSelector(download:) withObject:@"http://555.jpg" afterDelay:3];
2>dispatch_after
任務放到那個隊列中執行 延時多少秒
全局併發隊列 diapatch_queue_t = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY,0);
時間 double delay = 3; 延時多少秒
dispatch_after(DISPATCH_TIME_NOW,delay,queue,^{
///3秒後要執行的任務
});
7.一次性代碼
static dispatch_once_t onceToken; 隊列
dispatch_once(&onceToken,^{
在程序運行過程當中,永遠只執行一次
});