您的位置:首页 > 移动开发 > Swift

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: