美文网首页
GCD(dispatch_group,NSOperationQu

GCD(dispatch_group,NSOperationQu

作者: 上帝是个女孩丶 | 来源:发表于2017-12-11 18:27 被阅读22次

    关于GCD就不多介绍了,网上一大堆介绍。大致了解点的人都知道是用于IOS多线程操作的。Apple封装好的,解决多核多线程的可以自动管理线程的生命周期的强大API。

    简单描述下GCD和NSOperation的区别:

    1. GCD是基于C语言的,并不属于cocoa库
    2. NSOperation是基于GCD衍生出来的,但他是面向对象的,支持设置线程并发数,线程、任务优先级,依赖关系等。更适用于复杂的业务处理
    3. GCD相比来说更简单些,只需要执行block块中的代码即可。而NSOperationQueue是对象,所以相比来说更复杂点。
    4. 所以如果你的业务不是很复杂,那么GCD足够满足你了。代码看起来也会更加整洁。比较推荐的多线程。

    关于GCD网上大片的文章介绍同步异步啊,串行并行啊,对这个概念不熟的可以跳转我写的另一篇文章:http://www.jianshu.com/p/c169d17189eb 这里主要讲一下dispatch_group。

    dispatch_group

    先说一下为什么使用这个,有点类似于队列,其实简单来说就是为了方便管理。打个比方:

    比如你有100个孩子,然后你想知道谁快谁慢,如果不管理,他们乱跑,我们并不知道谁快谁慢。所以把他们分好班,排好序是最好的解决办法。
    然后因为是并发的,所以到了吃饭的时候,他们有可能都去抢同一个吃的。孩子是天真的,他们只会同时去抢。其实我的资源是够用的,但是因为大家一窝蜂的来,就容易挤爆了。而且这对于饭来说是很不安全的,多个人同时来吃同一份饭,饭就不知道自己该让谁吃,最终crash。


    网络请求大部分时候是异步的,用到多线程的大多也都是异步的.
    而队列遵循先进先出原则,同时限制了进入的个数,保证线程个数,以及数据唯一性。所以应用场景也大致就明确了。

    dispatch_group的使用也很简单,GCD封装的都很简单易懂。只需要了解几个方法即可:

    • dispatch_group_enter(group); 任务进去队列
    • dispatch_group_async(group,queue,^{
      });
      执行任务代码
    • dispatch_group_leave(group);任务完成离开队列
    • dispatch_group_wait(group, DISPATCH_TIME_FOREVER);等待上面的任务执行完成,第二个参数为等待时间
    • dispatch_group_notify(group queue, ^{
      });
      所有任务都完成才会调用此方法

    具体贴点代码差不多就理解了:

      dispatch_group_t groupOne = dispatch_group_create();
      dispatch_queue_t queueOne = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
            //group通常用于异步使用
        dispatch_group_enter(groupOne);
        
        dispatch_group_async(groupOne, queueOne, ^{
            
            sleep(5);
            dispatch_group_leave(groupOne);
    
        });
    
        //group wait等待线程
        dispatch_group_enter(groupOne);
        dispatch_group_async(groupOne, queueOne, ^{
    
            dispatch_group_async(groupOne, queueOne, ^{
    
                sleep(8);
                NSLog(@"会等待");
            });
            
            dispatch_group_leave(groupOne);
        });
        
    //wait函数一直阻塞,直到它发现group里面的任务全部leave,它才放弃阻塞(任务全部完成)
        dispatch_group_wait(groupOne, DISPATCH_TIME_FOREVER);
    
        //普通异步线程
        dispatch_group_enter(groupOne);
        dispatch_async(queueOne, ^{
             sleep(2);
            dispatch_group_leave(groupOne);
        });
        
        
        //group异步先执行完毕线程
        dispatch_group_enter(groupOne);
        dispatch_group_async(groupOne, queueOne, ^{
            
            dispatch_group_leave(groupOne);
            NSLog(@"我先完成");
        });
    
        //all结束
        dispatch_group_notify(groupOne, queueOne, ^{
            
            NSLog(@"dispatch_group_notify 执行,AllOver");
        });
    
    

    总结:

    1. dispatch_group的异步和普通线程的异步并无差别,使用方式均一样
    2. 所有leave执行完毕才会执行结束
    3. wait函数一直阻塞,直到它发现group里面的任务全部leave,它才放弃阻塞(任务全部完成) 注意用法,使用不对不生效
    4. enter和leave一定要成对出现,是一定。



    相关文章

      网友评论

          本文标题:GCD(dispatch_group,NSOperationQu

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