溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iOS多線程之GCD的基本使用

發(fā)布時間:2020-08-10 12:27:53 來源:網(wǎng)絡(luò) 閱讀:376 作者:ymanmeng123 欄目:移動開發(fā)

  • 使用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元素

    iOS多線程之GCD的基本使用



  • 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中,通過快捷鍵補全的代碼:

     iOS多線程之GCD的基本使用     

     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中,通過快捷鍵補全的代碼:

    iOS多線程之GCD的基本使用

     在block中添加任務(wù)代碼即可

應(yīng)用場景:單例對象的創(chuàng)建


向AI問一下細(xì)節(jié)

免責(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)容。

AI