1. 程式人生 > >ios多線程操作(四)—— GCD核心概念

ios多線程操作(四)—— GCD核心概念

indent img 操作 fort 16px 2.0 b2c 有一種 read


GCD全稱Grand Central Dispatch。可譯為“大派發中樞調度器”,以純C語言寫成,提供了很多很強大的函數。GCD是蘋果公司為多核的並行運算提出的解決方式,它能夠自己主動利用很多其它的CPU內核來參與運算。會自己主動管理線程的生命周(創建線程、調度任務、銷毀線程)。而程序猿僅僅須要告訴GCD想要運行什麽任務,不須要編寫不論什麽線程管理代碼!

GCD中有兩個核心概念,一是任務。二是隊列。 任務:要運行什麽樣的操作。任務都是預先以Block封裝好準備要運行的一段代碼。 隊列:用來存放任務,依照先進先出的方式,調度任務在哪一條線程上運行。 GCD中有兩個用來運行任務的函數,各自是同步函數和異步函數。

同步函數:該函數的代碼形式例如以下 dispatch_sync(dispatch_queue_t queue, ^(void)block) 當中queue為隊列,block為任務 同步任務並不會創建線程,但會在當前線程(能夠是子線程,頁能夠是主線程)中運行。同步任務有一個特性。僅僅要同步任務一加入到隊列中就要立即運行。同步任務不運行完就不會運行往後的代碼。

比如:
- (void)viewDidLoad {
    [super viewDidLoad];
    // 獲得全局隊列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    // 運行同步任務
    dispatch_sync(q, ^{
        // 讓運行該任務的線程休眠2s
        [NSThread sleepForTimeInterval:2.0];
        NSLog(@"block - %@",[NSThread currentThread]);
    });
    NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}

執行結果例如以下: 技術分享

據此能夠驗證同步任務的特性
異步函數: dispatch_async(dispatch_queue_t queue, ^(void)block) 普通情況下異步任務都會開啟一條子線程在後臺運行(有一種情況除外。後面會講到),異步任務的一個特性就是不用等待當前線程的任務就能直接運行 比如:
- (void)viewDidLoad {
    [super viewDidLoad];
    // 獲得全局隊列
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);
    // 運行異步任務
    dispatch_async(q, ^{
        //
        for (int i = 0; i<10; i++) {
            NSLog(@"block - %@ - %d",[NSThread currentThread],i);
        }
    });
    NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}

執行結果例如以下: 技術分享

第二次執行結果: 技術分享
能夠看到兩次執行結果不同,且不在同一線程中. 假設將代碼改為例如以下形式:
- (void)viewDidLoad {
    [superviewDidLoad];
    //獲得全局隊列
    dispatch_queue_t q =dispatch_get_global_queue(0, 0);
    //運行異步任務
    for (int i = 0; i< 10; i++) {
        dispatch_async(q, ^{
            NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i);
        });
        
    }
    NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]);
}

運行結果例如以下: 技術分享
由此可得隊列開啟多少條我們無法控制。異步函數並不會等待當前線程(當前線程為主線程)的任務。

ios多線程操作(四)—— GCD核心概念