07-主佇列和全域性佇列

葉喬木發表於2018-12-14

GCD 會主動的提供一個佇列供開發者使用。

主佇列 系統提供的序列佇列

是在主執行緒執行的佇列,所以是序列的佇列。任務一個個執行。

dispatch_get_main_queue()

全域性佇列 系統提供的併發佇列

全域性佇列是所有應用程式都能夠使用的併發佇列,不需要手動的建立併發佇列了。

dispatch_get_global_queue

分為四個優先順序
名稱 執行方式 備註
dispatch_get_main_queue 序列 主執行緒執行
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 併發 優先順序高
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 併發 預設
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); 併發
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 併發 後臺執行

dispatch_queue_create

dispatch_queue_create 建立生成的佇列不管是序列的還是並行的,優先順序和全域性佇列形同的預設的優先順序

    // 建立一個序列佇列
    dispatch_queue_t queue1 = dispatch_queue_create("sk1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("sk2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("sk3", DISPATCH_QUEUE_SERIAL);
    
    // 列印1 2 3 為一個統一的任務。一個任務被拆分成多個任務放到多個序列佇列中去,但是執行順序還是要保持和
    // 在一個序列佇列中的一致效果。列印順序為 1 2 3
    dispatch_async(queue1, ^{
        NSLog(@"Hello from queue1");
    });
   
    dispatch_async(queue2, ^{
        NSLog(@"Hello from queue2");
    });
    
    dispatch_async(queue3, ^{
        NSLog(@"Hello from queue3");
    });

// 列印順序 因為不同的佇列,任務都是併發執行,所以列印順序是不一定的
2018-12-13 10:49:22.267722+0800 SK_Thread_Demo[4976:69000] Hello from queue3
2018-12-13 10:49:22.267722+0800 SK_Thread_Demo[4976:69002] Hello from queue1
2018-12-13 10:49:22.267722+0800 SK_Thread_Demo[4976:69001] Hello from queue2

dispatch_set_target_queue 使用佇列優先順序,讓佇列指定佇列同步執行

    // 目標佇列
    dispatch_queue_t targetQueue = dispatch_queue_create("target", DISPATCH_QUEUE_SERIAL);
    
    // 建立一個序列佇列
    dispatch_queue_t queue1 = dispatch_queue_create("sk1", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue2 = dispatch_queue_create("sk2", DISPATCH_QUEUE_SERIAL);
    dispatch_queue_t queue3 = dispatch_queue_create("sk3", DISPATCH_QUEUE_SERIAL);
    
    // 列印1 2 3 為一個統一的任務。一個任務被拆分成多個任務放到多個序列佇列中去,但是執行順序還是要保持和 在一個序列佇列中的一致效果。例如說 列印順序為 1 2 3
    
    // 變更優先順序
    // 追加到目標序列佇列中 防止處理並行執行
    dispatch_set_target_queue(queue3, targetQueue);
    dispatch_set_target_queue(queue1, targetQueue);
    dispatch_set_target_queue(queue2, targetQueue);
    
    dispatch_async(queue1, ^{
        sleep(1);
        NSLog(@"Hello from queue1");
    });
   
    dispatch_async(queue2, ^{
        sleep(1);
        NSLog(@"Hello from queue2");
    });

    dispatch_async(queue3, ^{
        sleep(1);
        NSLog(@"Hello from queue3");
    });
	
// 列印結果
2018-12-13 11:03:58.880544+0800 SK_Thread_Demo[5310:79080] Hello from queue1
2018-12-13 11:03:59.885092+0800 SK_Thread_Demo[5310:79080] Hello from queue2
2018-12-13 11:04:00.886197+0800 SK_Thread_Demo[5310:79080] Hello from queue3

相關文章