07 GCD同步任务加强

作者: CC老师_HelloCoder | 来源:发表于2017-09-04 20:04 被阅读730次

    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半,将下载异步任务重新开辟一条线程执行。直到全部结束!
    Snip20170811_2.png

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

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

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

    相关文章

      网友评论

        本文标题:07 GCD同步任务加强

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