中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

iOS多線程之GCD的基本使用

發布時間:2020-08-10 12:27:53 來源:網絡 閱讀:376 作者:ymanmeng123 欄目:移動開發

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

    iOS多線程之GCD的基本使用



  • GCD的一些其他常用操作

1)任務的延遲執行

dispatch_after函數會延遲將一個block任務添加到隊列中

void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);

     在Xcode中,通過快捷鍵補全的代碼:

     iOS多線程之GCD的基本使用     

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

    iOS多線程之GCD的基本使用

     在block中添加任務代碼即可

應用場景:單例對象的創建


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

潜江市| 定州市| 波密县| 福清市| 宜章县| 苍山县| 新兴县| 遂平县| 灯塔市| 武定县| 平度市| 和硕县| 苍山县| 玉溪市| 伊春市| 米易县| 焉耆| 灵台县| 平阴县| 建水县| 唐山市| 如皋市| 婺源县| 清新县| 马山县| 龙游县| 浦江县| 哈巴河县| 敦化市| 泰宁县| 辽宁省| 太保市| 双牌县| 仪征市| 达孜县| 河源市| 稷山县| 华阴市| 准格尔旗| 华池县| 霸州市|