您好,登錄后才能下訂單哦!
使用GCD開發的基本思路
基本思想:將任務(操作)放在隊列中去執行
任務使用block定義
隊列負責調度任務執行所在的線程以及具體的執行時間
隊列的特點是先進先出(FIFO)的,新添加至隊列的操作都會排在隊尾.
GCD的函數都是以dispatch開頭的
注意 :隊列不是線程,也不對應CPU。
隊列:dispatch_queue_t
兩種隊列:串行隊列、并行隊列
隊列上的操作:添加任務
兩種任務:同步任務、異步任務
隊列及任務
GCD的串行隊列,意味著隊列中的任務排隊執行
1)添加異步任務:創建一個線程,所有被添加的任務排隊執行
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); for ( int i=0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }
2)添加同步任務:不創建線程,任務在當前線程中執行,極少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
CGD并行隊列,意味著隊列中任務不會排隊執行,隨機執行
1)添加異步任務:會創建線程,個數不確定,任務的先后順序不確定
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
2)添加同步任務:不會創建線程,極少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
無論什么隊列和什么任務,線程的創建和回收都不需要程序員參與,線程的創建和回收是由隊列負責的
全局隊列
GCD的最常用隊列是全局隊列和主隊列,這兩種隊列不需要創建,是每個App都具有的
獲得全局隊列
dispatch_queue_t dispatch_get_global_queue( long identifier, unsigned long flags);
flags參數:保留參數,傳0即可
identifier參數:用于指定使用哪種全局隊列
四種全局隊列:
#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 //最低的后臺優先級
全局隊列是系統的,拿過來直接用即可,都是并行隊列
添加異步任務,會創建多個線程,任務無須執行
添加同步任務,不會創建新線程,任務排序執行
主隊列
每一個應用程序都只有一個主線程,在iOS開發中,所有UI的更新操作,都必須在主線程中去做
獲得主隊列:
dispatch_queue_t dispatch_get_main_queue(void);
主隊列也是系統的,拿過來直接用即可,添加的任務都會在主線程終止hi性
添加異步任務:在主線程中順序執行,無異步效果
添加同步任務:任務不會執行
常見的用法:
如果一個任務想要在后臺(子線程)執行,則使用全局隊列添加異步任務
如果一個任務想要在主線程執行,則使用主隊列添加同步任務
異步下載圖片
這是一類最常見的做法,在子線程中請求數據,完成后回到主線程中更新相關的UI元素
GCD的一些其他常用操作
1)任務的延遲執行
dispatch_after函數會延遲將一個block任務添加到隊列中
void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);
在Xcode中,通過快捷鍵補全的代碼:
delayInSeconds:延遲的秒數
使用的主隊列,即延遲的任務在主線程中執行
最后的block,即任務代碼
2)任務的多次執行
dispatch_apply函數將一個任務放到隊列中多次執行
具體是串行執行還是并行執行是由具體的隊列決定。
dispatch_apply不會立刻返回,在執行完畢后才返回,是同步的調用
void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));
iteractions:執行的次數
queue:隊列,一般使用全局隊列
block:任務代碼
應用場景:將關系不緊密的循環操作放到后臺運行
3)保證任務只執行一次
在多線程的環境下,同故宮dispatch_once()保證一個任務只會執行一次
在Xcode中,通過快捷鍵補全的代碼:
在block中添加任務代碼即可
應用場景:單例對象的創建
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。