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