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]);

    });


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


原创粉丝点击