iOS开发之GCD同步任务加强

作者: 程序员_秃头怪 | 来源:发表于2019-03-07 21:19 被阅读4次

iOS开发多线程之GCD
iOS开发之GCD同步任务加强
iOS开发之GCD串行队列
iOS开发之GCD并发队列

004

同步任何的作用:

在开发中,通常会将耗时操作放后台执行,有的时候,有些任何彼此有依赖关系!

例子:登录、支付、下载

在队列里,依赖执行同一时间。

-(void)gcdDemo5{

    //创建一个异步队列
    dispatch_queue_t q = dispatch_queue_create("cc_queue2",DISPATCH_QUEUE_CONCURRENT);
    //1.用户登录
    dispatch_sync(q,^{
    NSLog(@"用户登录 %@",[NSThread currentThread]);
    });

    //2.支付
    dispatch_async(q,^{
    NSLog(@"支付 %@",[NSThread currentThread]);
    });

    //3.下载
    dispatch_async(q,^{
    NSLog(@"下载  %@",[NSThread currentThread]);
    });
}

步骤

  • 新建一个队列,并加入3个任务
  • ==修改==登录任务为dispatch_sync 同步任务。这个任务必须先执行,它执行的时候,因为是同步,不会去GCD拿线程。等登录任务完成后,在执行支付任务和下载任务时,会用子线程去做!
  • 同步任务 没有执行完毕,后面的所有任务都不会去执行。所以它相当于一个🔐的功能。
  • 利用同步任务,能够做到任务依赖关系。前一个任务是同步任务,它不执行完成,队列就不会调度后面的任务。

增强版同步任务

-(void)gcdDemo6
{
    //队列
    dispatch_queue_t q = dispatch_queue_create("cc_queue",DISPATCH_QUEUE_CONCURRENT);

    //任务,在这个任务中添加了3个任务
    void (^task)() = ^{

        //1.用户登录
    dispatch_async(q,^{
    NSLog(@"用户登录 %@",[NSThread currentThread]);
    });

    //2.支付
    dispatch_async(q,^{
    NSLog(@"支付 %@",[NSThread currentThread]);
    });

    //3.下载
    dispatch_async(q,^{
    NSLog(@"下载  %@",[NSThread currentThread]);
    }); 
    };

    for(int i = 0; i < 10; i++)
    {
        NSLog(@"%d %@",i,[NSThread currentThread]);
    }

    //将task 丢到异步执行中去。
    dispatch_async(q,task);
    NLog(@"come here");
}

同步任务,不会取线程。但是如果这个任务本身就是在子线程上跑的了?
代码分析:

  • 首先async异步,会开启一个子线程,执行任务task;
  • 任务task,包含了3个子任务;
  • 将任务添加到队列中,完成后task任务完成;
  • 队列此时添加了3个任务;
  • 先在子线程上执行同步登录任务;等待完成后;
  • 将支付异步任务在子线程上执行,等到执行到1半,将下载异步任务重新开辟一条线程执行。直到全部结束!

结论:从添加任务task 到 登录、支付、下载都是在子线程上操作的。不会造成主线程阻塞!

思考:
1.用户登录是在主线程还是子线程?
登录、下载、支付都在子线程
2.执行顺序是什么?
先执行“登录”,支付和下载不确定先后;
3.come here什么时候执行?
立马执行!靠前。因为come here在主线程
4.for 循环执行位置是什么?
与添加任务同级别。task会顺序执行。

小结:
可以队列调度多个任务前,指定一个同步任务,让所有的异步任务,等待同步任务执行完成。这就是依赖关系。
同步任务,会造成一个🔐

推荐文集

* iOS开发之性能优化

* iOS开发之weak底层实现原理

* 2019年iOS面试必备技术点总结

原文作者:集才华美貌于一身的—C姐

相关文章

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • 多线程

    iOS中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • 07 GCD同步任务加强

    004 同步任何的作用: 在开发中,通常会将耗时操作放后台执行,有的时候,有些任何彼此有依赖关系! 例子:登录、支...

  • iOS 开发之 GCD 不同场景使用

    iOS 开发之 GCD 不同场景使用 本文在iOS 开发值 GCD 基础 的基础上,继续总结了 GCD 的一些AP...

  • 多线程相关之GCD、死锁、dispatch_barrier_as

    推荐阅读:备战2020——iOS全新面试题总结 GCD---同步/异步 ,串行/并发 死锁 GCD任务执行顺序 d...

  • 探寻iOS多线程

    iOS中的常见多线程方案 GCD GCD中有2个用来执行任务的函数 用同步的方式执行任务dispatch_sync...

  • GCD的学习笔记(One)

    并行和并发 GCD简介 GCD的任务 GCD的队列 GCD创建队列或获取队列的方法 任务的执行方式:同步执行(同步...

网友评论

    本文标题:iOS开发之GCD同步任务加强

    本文链接:https://www.haomeiwen.com/subject/hexkpqtx.html