GCD swift dispatch_set_target_queue 小例
2017-05-31 17:04
676 查看
首先先看一段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 {
4000
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 将队列加入目标队列,并且按照目标队列的顺序执行。如果是串行队列就串行同步执行,并发队列就异步并发执行。
小例源码:
https://github.com/RainManGO/GCD_targetQueueDemo.git
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 {
4000
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 将队列加入目标队列,并且按照目标队列的顺序执行。如果是串行队列就串行同步执行,并发队列就异步并发执行。
小例源码:
https://github.com/RainManGO/GCD_targetQueueDemo.git
相关文章推荐
- GCD学习之dispatch_set_target_queue
- GCD之dispatch_set_target_queue
- GCD学习笔记(四):dispatch_set_target_queue
- iOS开发之GCD(4)API dispatch_set_target_queue
- dispatch_set_target_queue
- dispatch_set_target_queue
- dispatch_set_target_queue一些理解
- iOS dispatch_set_target_queue 详解
- dispatch_set_target_queue
- dispatch_set_target_queue一些理解
- iOS学习笔记5-GCDAsyncUdpSocket中的dispatch_queue_set_specific
- dispatch_set_target_queue 说明
- 完整详解swift GCD系列(四)dispatch_semaphore(信号量)
- GCD之dispatch queue深入浅出
- GCD之dispatch queue
- GCD 被弃方法dispatch_get_current_queue
- GCD之dispatch queue
- 第3月第1天 GCDAsyncSocket dispatch_source_set_event_handler runloop
- GCD dispatch_async dispatch_get_main_queue
- GCD之dispatch queue深入浅出