前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GCD swift dispatch_set_target_queue 小例

GCD swift dispatch_set_target_queue 小例

作者头像
星宇大前端
发布2019-01-15 14:39:39
6890
发布2019-01-15 14:39:39
举报
文章被收录于专栏:大宇笔记

首先先看一段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   将队列加入目标队列,并且按照目标队列的顺序执行。如果是串行队列就串行同步执行,并发队列就异步并发执行。

小例源码:

https://github.com/RainManGO/GCD_targetQueueDemo.git

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年05月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档