iOS GCD的使用

oigo2036 8年前發布 | 16K 次閱讀 iOS開發 Objective-C開發

來自: http://www.cnblogs.com/heyuanbo/p/5203437.html

GCD  Grand Central Dispatch 純C語言編寫

1. GCD是蘋果公司為多核的并行運算提出的解決方案

GCD會自動利用更多的CPU內核(比如雙核、四核)

GCD會自動管理線程的生命周期(創建線程、調度任務、銷毀線程)

程序員只需要告訴GCD想要執行什么任務,不需要編寫任何線程管理代碼

進程:也就是一個正在運行的應用程序。

線程:進程中的某一條完整的執行路徑。一個進程可以有多個線程,至少有一個線程,即主線程。在iOS開發中,所有涉及UI界面的,必須在主線程中更新。

2.   GCD的工作原理:讓程序平行排隊,根據可用的處理資源,安排他們在任何可用的處理器上執行任務

3.   串行隊列,并行隊列,同步任務,異步任務。 異步任務會開辟線程:異步任務在串行隊列只開啟一個子線程,異步任務在并行隊列開啟多個子線程。

 //GCD 并行隊列,異步任務:開啟多個線程,同時執行。
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        for (int i =0; i<1000; i++) {
            NSLog(@"AAAAA %d",i);
        }
    });

dispatch_async(queue, ^{
    for (int i =0; i<1000; i++) {
        NSLog(@"BBBBB %d",i);
    }
});

dispatch_async(queue, ^{
    for (int i =0; i<1000; i++) {
        NSLog(@"CCCCC %d",i);
    }
});

//串行隊列,同步任務 :不開啟線程,按順序執行
dispatch_queue_t Cqueue = dispatch_queue_create("queueName", NULL);
dispatch_sync(Cqueue, ^{
    for (int i =0; i<1000; i++) {
        NSLog(@"DDDDD %d",i);
    }
});

dispatch_sync(Cqueue, ^{
    for (int i =0; i<1000; i++) {
        NSLog(@"EEEEE %d",i);
    }
});

dispatch_sync(Cqueue, ^{
    for (int i =0; i<1000; i++) {
        NSLog(@"FFFFF %d",i);
    }
});</pre> 

4.我們平時使用多線程,會經常碰到一種需求:子線程任務處理完成之后,需要主線程更新UI。我們如何才能知道子線程的任務都完成了。

當我們使用串行隊列時,只需將最后的回調主線程任務添加在所有任務的最后,順序執行,便可回調。 但是當我們使用并行隊列時候,就無法知道什么時候完成所有的子線程任務,

這時候,就得用到dispatch_group了。代碼如下:

 //我們同時執行幾個異步任務,他們執行完了,我們有時候還得知道一下,,怎么辦呢,這時候,就得用到dispatch_group了,如下編代碼這樣弄,到最后執行 dispatch_group_notify ,便可
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        NSLog(@"開始執行1");
    });

dispatch_group_async(group, queue, ^{
    NSLog(@"開始執行2");
});

dispatch_group_async(group, queue, ^{
    NSLog(@"開始執行3");
});

dispatch_group_notify(group, queue, ^{
    NSLog(@"全部執行完成,必須在主線程更新UI!!!");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"主線程更新UI完成。");
    });
});</pre> </div>
 本文由用戶 oigo2036 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!