GCD swift dispatch_set_target_queue 小例
来源:互联网 发布:link域名的好处 编辑:程序博客网 时间:2024/05/20 15:40
首先先看一段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 ---- %@",[NSThreadcurrentThread]);
[NSThreadsleepForTimeInterval:3.f];
NSLog(@"task 1 out ---- %@",[NSThreadcurrentThread]);
});
dispatch_async(secondQueue, ^{
NSLog(@"task 2 in ---- %@",[NSThreadcurrentThread]);
[NSThreadsleepForTimeInterval:2.f];
NSLog(@"task 2 out ---- %@",[NSThreadcurrentThread]);
});
dispatch_async(secondQueue, ^{
NSLog(@"task 3 in ---- %@",[NSThreadcurrentThread]);
[NSThreadsleepForTimeInterval:1.f];
NSLog(@"task 3 out ---- %@",[NSThreadcurrentThread]);
});
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 swift dispatch_set_target_queue 小例
- GCD之dispatch_set_target_queue
- GCD学习笔记(四):dispatch_set_target_queue
- GCD学习之——dispatch_set_target_queue
- dispatch_set_target_queue
- dispatch_set_target_queue
- dispatch_set_target_queue
- iOS开发之GCD(4)API dispatch_set_target_queue
- GCD学习 - swift GCD使用指南
- gcd(swift)
- Swift之GCD(一)
- swift之GCD(二)
- gcd的封装(swift)
- iOS多线程(GCD)(swift)
- 【iOS】Swift GCD-上
- 【iOS】Swift GCD-下
- 【iOS】Swift GCD-上
- 【iOS】Swift GCD-下
- 三分套三分(bzoj4885)
- Java内部类
- 配置oschina的ssh
- 性能优化-单表数据过大
- 设计模式—外观模式(八)
- GCD swift dispatch_set_target_queue 小例
- Windows下用PIP安装scipy出现 no lapack/blas resources found
- 初始jQuery
- android中inputType属性在EditText
- const与指针及初始化
- zynq7000平台AXI_lite与Native FIFO接口设计
- linux防火墙之iptables和NAT
- ios系统中各种设置项的url链接
- Python进阶(五十二)-Flask使用pymysql连接MySQL数据库