Dispatch Queues有以下3種類型:
1.Serial Queue:串列執行block,會依照放入的順序執行。
2.Concurrent Queue:可以同時執行多個block,但是執行完成的順序是隨機的。
3.Main dispatch queue:在應用程式的main thread中執行block。
下面是幾個簡單的使用方式:
1.Serial Queue
建立Serial Queue的方法很簡單,首先先宣告一個dispatch_queue_create建立一個dispatch_queue_t,然後執行dispatch_async的block。範例裡分別執行2個Serial Queue,尤於是Serial Queue一次只執行一次的特性的,所以會先執行Run1,結束後再執行Run2。
dispatch_queue_t createQueue = dispatch_queue_create("SerialQueue", nil);
dispatch_async(createQueue, ^(){
[self run1];
});
dispatch_async(createQueue, ^(){
[self run2];
});
- (void)run1{
for (int i=0; i<5 br="" i="">
[NSThread sleepForTimeInterval:1];
NSLog(@"Run1:%d",i);
}
}
- (void)run2{
for (int i=0; i<5 br="" i="">
[NSThread sleepForTimeInterval:0.3f];
NSLog(@"*Run2:%d",i);
}
}5>5>
執行結果
Run1:0
Run1:1
Run1:2
Run1:3
Run1:4
*Run2:0
*Run2:1
*Run2:2
*Run2:3
*Run2:4
有時,當我們需要在背景用執行緒讀取資料,完成後再更新UI,這時可以用以下的寫法:
dispatch_queue_t createQueue = dispatch_queue_create("SerialQueue", nil);
dispatch_async(createQueue, ^(){
[self run1];
dispatch_async(dispatch_get_main_queue(), ^(){
[self run2];
});
});
執行結果跟上面的例子一樣,但不同的是,當run1執行完成後,run2是交由dispatch_get_main_queue(),也就是Main Thread來完成,所以當有需要更新UI的地方,可以採取這樣的寫法。
2.Concurrent Queue
建立Cocurrent Queue的方法如下,首先建立dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),DISPATCH_QUEUE_PRIORITY_DEFAULT的意思是交由OS來管理優先順序,開發者可以根據需求調整執行的優先權,系統提供4種:
#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
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^(){
[self run1];
});
dispatch_async(queue, ^(){
[self run2];
});
執行結果
*Run2:0
*Run2:1
*Run2:2
Run1:0
*Run2:3
*Run2:4
Run1:1
Run1:2
Run1:3
Run1:4
可以看到,執行的結果完全是隨機的,也就是說,系統是同時在背景執行2個block。
3.Main dispatch queue
尤於是在主執行緒上執行,所以執行的時候,其它正在執行緒上跑的block都會排隊執行。
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^(){
[self run1];
dispatch_async(dispatch_get_main_queue(), ^(){
[self run2];
});
});
執行結果
Run1:0
Run1:1
Run1:2
Run1:3
Run1:4
*Run2:0
*Run2:1
*Run2:2
*Run2:3
*Run2:4
後續還有Group of Queue,待我研究後補上。
參考資料
GCD介绍(一): 基本概念和Dispatch Queue
Austin's study note - 多工筆記 (GCD)
沒有留言:
張貼留言