珊栏函数 iOS之多线程GCD(三)

栏目: IOS · 发布时间: 5年前

内容简介:场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用dispatch_barrier_async。特点:像一堵围墙、成为任务的分割线。分析:任务一和任务二相互交错执行、由于珊栏函数存在、任务三最后执行。这三个任务都是异步完成、在各自的线程里。

场景需求:需要异步完成三个任务。任务一、任务二、任务三。要求:任务三必须在任务一、任务二完成之后触发。这就需要使用dispatch_barrier_async。

特点:像一堵围墙、成为任务的分割线。

代码如下:

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        //任务1
        for (int i = 0; i < 2; i++) {
            NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        //任务2
        for (int i = 0; i < 2 ; i++) {
            NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
        }
    });
    
    
    dispatch_barrier_async(queue, ^{
        //珊栏
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        //任务3
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
        }
    });
复制代码

分析:任务一和任务二相互交错执行、由于珊栏函数存在、任务三最后执行。这三个任务都是异步完成、在各自的线程里。

dispatch_barrier_async 、dispatch_barrier_sync区别

直接看如下代码:

1.dispatch_barrier_async

NSLog(@"开始啦");
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        //任务1
        for (int i = 0; i < 2; i++) {
            NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        //任务2
        for (int i = 0; i < 2 ; i++) {
            NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
        }
    });
    
      NSLog(@"动啊动啊");
    dispatch_barrier_async(queue, ^{
        //珊栏
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        //任务3
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
        }
    });
    NSLog(@"结束啦");
复制代码

打印结果:

2019-01-25 13:47:17.656139+0800 多线程demo[4912:51826] 开始啦
2019-01-25 13:47:17.656348+0800 多线程demo[4912:51826] 动啊动啊
2019-01-25 13:47:17.656463+0800 多线程demo[4912:51882] 我是任务一、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.656470+0800 多线程demo[4912:51884] 我是任务二、来自线程:<NSThread: 0x60000047ed00>{number = 4, name = (null)}
2019-01-25 13:47:17.656599+0800 多线程demo[4912:51826] 结束啦
2019-01-25 13:47:17.656654+0800 多线程demo[4912:51884] 我是任务二、来自线程:<NSThread: 0x60000047ed00>{number = 4, name = (null)}
2019-01-25 13:47:17.656654+0800 多线程demo[4912:51882] 我是任务一、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.657139+0800 多线程demo[4912:51882] 我是分割线、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}
2019-01-25 13:47:17.657313+0800 多线程demo[4912:51882] 我是任务三、来自线程:<NSThread: 0x60000047f740>{number = 3, name = (null)}

复制代码

分析:任务三确实在任务一、任务二之后完成。使用dispatch_barrier_async、体现了异步的特点、不做任何等待、直接返回。所以主线程中的打印、不会在珊栏函数后面。

2.dispatch_barrier_sync

代码如下:

NSLog(@"开始啦");
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        //任务1
        for (int i = 0; i < 2; i++) {
            NSLog(@"我是任务一、来自线程:%@",[NSThread currentThread]);
        }
    });
    dispatch_async(queue, ^{
        //任务2
        for (int i = 0; i < 2 ; i++) {
            NSLog(@"我是任务二、来自线程:%@",[NSThread currentThread]);
        }
    });
    
    NSLog(@"动次打次:%@",[NSThread currentThread]);
    dispatch_barrier_sync(queue, ^{
        //珊栏
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是分割线、来自线程:%@",[NSThread currentThread]);
        }
    });
    
    dispatch_async(queue, ^{
        //任务3
        for (int i = 0; i < 1 ; i++) {
            NSLog(@"我是任务三、来自线程:%@",[NSThread currentThread]);
        }
    });
    NSLog(@"结束啦");
复制代码

打印结果:

2019-01-25 13:54:09.045223+0800 多线程demo[5014:57352] 开始啦
2019-01-25 13:54:09.045461+0800 多线程demo[5014:57352] 动次打次:<NSThread: 0x600000072f00>{number = 1, name = main}
2019-01-25 13:54:09.045486+0800 多线程demo[5014:57400] 我是任务二、来自线程:<NSThread: 0x60000026dd80>{number = 4, name = (null)}
2019-01-25 13:54:09.045496+0800 多线程demo[5014:57404] 我是任务一、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
2019-01-25 13:54:09.045758+0800 多线程demo[5014:57400] 我是任务二、来自线程:<NSThread: 0x60000026dd80>{number = 4, name = (null)}
2019-01-25 13:54:09.045830+0800 多线程demo[5014:57404] 我是任务一、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
2019-01-25 13:54:09.045991+0800 多线程demo[5014:57352] 我是分割线、来自线程:<NSThread: 0x600000072f00>{number = 1, name = main}
2019-01-25 13:54:09.046099+0800 多线程demo[5014:57352] 结束啦
2019-01-25 13:54:09.046124+0800 多线程demo[5014:57404] 我是任务三、来自线程:<NSThread: 0x600000260b80>{number = 3, name = (null)}
复制代码

分析:确实分割了前后执行的任务


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网站重构

网站重构

[美] Jeffrey Zeldman / 傅捷、王宗义、祝军 / 电子工业出版社 / 2005-4 / 38.00元

这本书是为了希望自己的网站成本变得更低,运行得更好,访问者更多的网页设计师、开发者、网站所有者及管理者写的。 书中着重分析了目前网站建设中存在的一些问题,以及“Web标准”思想的产生、发展和推广,并从技术细节上讲解了网站实际制作和开发的过程中如何向Web标准过渡,如何采用和符合Web标准。本书的出版目的就是帮助读者理解Web标准,创建出用最低的费用达到最多的用户,并维持最长时间的网站,并且提......一起来看看 《网站重构》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码