07-主佇列和全域性佇列
阿新 • • 發佈:2019-01-02
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