首先先看一段GCD代码:
func begainDemo(){
let Queue1 = DispatchQueue(label:"Queue1")
let Queue2 = DispatchQueue(label:"Queue2",attributes:DispatchQueue.Attributes.concurrent)
Queue1.async {
print("task 1 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 1 out")
}
Queue2.async {
print("task 2 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 2 out")
}
Queue2.async {
print("task 3 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 3 out")
}
}
打印结果如下:
没有设置队列target之前打印如下:
=======================================
task 1 in ----<NSThread: 0x60800007d480>{number = 3, name = (null)}
task 2 in ----<NSThread: 0x60800007d540>{number = 4, name = (null)}
task 3 in ----<NSThread: 0x60800007d600>{number = 5, name = (null)}
task 3 out
task 1 out
task 2 out
dispatch_set_target_queue
在OC中GCD:
dispatch_set_target_queue : 将队列添加到目标队列
这个例子是将一个串行队列和一个并行队列都加到一个串行队列。
OC版源码如下:
dispatch_queue_t serialQueue = dispatch_queue_create("zy.serialqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t firstQueue = dispatch_queue_create("zy.firstqueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t secondQueue = dispatch_queue_create("zy.secondqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_set_target_queue(firstQueue, serialQueue);
dispatch_set_target_queue(secondQueue, serialQueue);
dispatch_async(firstQueue, ^{
NSLog(@"task 1 in ---- %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:3.f];
NSLog(@"task 1 out ---- %@",[NSThread currentThread]);
});
dispatch_async(secondQueue, ^{
NSLog(@"task 2 in ---- %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:2.f];
NSLog(@"task 2 out ---- %@",[NSThread currentThread]);
});
dispatch_async(secondQueue, ^{
NSLog(@"task 3 in ---- %@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:1.f];
NSLog(@"task 3 out ---- %@",[NSThread currentThread]);
});
swift代码 :
func dispatchSetTargetQueueDemo(){
let targetQueue = DispatchQueue(label:"targetQueue",attributes:DispatchQueue.Attributes.concurrent)
let Queue1 = DispatchQueue(label:"Queue1",target:targetQueue)
let Queue2 = DispatchQueue(label:"Queue2",attributes:DispatchQueue.Attributes.concurrent,target:targetQueue)
Queue1.async {
print("task 1 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 1 out")
}
Queue2.async {
print("task 2 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 2 out")
}
Queue2.async {
print("task 3 in ----\(Thread.current)")
Thread.sleep(forTimeInterval: 3)
print("task 3 out")
}
}
验证一: 如果一个串行队列和一个并行队列,添加到一个串行队列。
结果打印如下:
设置队列target之前打印如下:
task 1 in ----<NSThread: 0x608000264bc0>{number = 3, name = (null)}
task 1 out
task 2 in ----<NSThread: 0x608000264bc0>{number = 3, name = (null)}
task 2 out
task 3 in ----<NSThread: 0x608000264bc0>{number = 3, name = (null)}
task 3 out
结果分析:
下面的两个队列的任务会在串行队列里,同步执行。
验证二: 如果一个串行队列和一个并行队列,添加到一个并行队列。
结果打印如下:
设置队列target之前打印如下:
task 1 in ----<NSThread: 0x60800026be80>{number = 3, name = (null)}
task 2 in ----<NSThread: 0x60800026bf80>{number = 4, name = (null)}
task 3 in ----<NSThread: 0x60800026c080>{number = 5, name = (null)}
task 1 out
task 3 out
task 2 out
结果分析:
下面的两个队列的任务会在并行队列里,异步执行。
总结:dispatch_set_target_queue 将队列加入目标队列,并且按照目标队列的顺序执行。如果是串行队列就串行同步执行,并发队列就异步并发执行。
小例源码: