GCD的简单学习与使用

作者: byhuang | 来源:发表于2016-09-02 15:38 被阅读133次

    GCD 就是苹果给我们封装好的异步执行的代码~

    苹果官方对GCD的说明:开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中。

    dispatch_async(queue, ^{
            //想要做的事
        })
    

    Dispatch Queue 就是执行处理的等待队列,按照FIFO先进先出的顺序执行

    并且Dispatch Queue还分为两种:

    • Serial Dispatch Queue 即只使用单线程,执行完成的顺序和执行顺序一致---串行队列
    • Concurrent Dispatch Queue 多个线程一起执行。执行完成的顺序和执行顺序不一致---并行队列

    创建队列:

    • 串行队列:

    dispatch_queue_t serialQueue = dispatch_queue_create
    ("info.byhuang.SerialQueue", DISPATCH_QUEUE_SERIAL);
    //可以是使用NULL代替DISPATCH_QUEUE_SERIAL 详情可以看这个宏的定义

    
    * 并行队列:
    
    * ```
    dispatch_queue_t concurrentQueue = dispatch_queue_create
    ("info.byhuang.ConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    

    创建出来的是不是串行或并行,大家可以自己测试一下即可

    当然系统也为我们提供了几个不同优先级的并行队列,让我们可以快速使用:

        //优先级最高队列- 并行
        dispatch_queue_t globalHighQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        //默认优先级
        dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        //低优先级
        dispatch_queue_t globalLowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        
        //后台运行
        dispatch_queue_t globalBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    

    在前面我们自己创建的队列也是有优先级的,它的默认优先级是default ,如果

    我们想要修改它的优先级就需要使用<b>target_queue</b>

        //自定义一个队列
        dispatch_queue_t highQueue = dispatch_queue_create("info.byhuang.highQueue", DISPATCH_QUEUE_CONCURRENT);
        
        //变更队列的优先级
        dispatch_set_target_queue(highQueue, globalHighQueue);
    

    如果我们需要在固定的时间之后把某个操作假如到队列中怎么办呢?没关系已经有现成的可以用啦~~ dispatch_after,就可以帮你解决!

    //ull是c语言的数值字面量
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC*3ull);
    
    dispatch_after(time, highQueue, ^{
            NSLog(@"Hi byhuang ");
        });
    

    但是要注意dispatch_after>不是在指定事件执行而是在指定时间之后加入到队列中,所以等待时间会大雨等于time。因为有可能队列中任务有很多啊,我们在三秒中之后只是加入到队列中,还没有算等待的时间呢;

    需要在队列中任务执行完之后再执行某个任务的时候就要用到dispatch_group

    dispatch_group_t group = dispatch_group_create();
        dispatch_group_notify(group, dispatch_get_main_queue(), ^{
            NSLog(@"全部执行完了");
        });
    
        //需要配合 dispatch_group_async使用加入到group中
        dispatch_group_async(group, highQueue, ^{
            NSLog(@"111zz");
        });
    

    group中可以包含有不同队列中的任务。只有把任务加入到group中。当任务执行完就会调用dispatch_group_notify来执行我们所追加的任务了,怎么样是不是很简单~

    还有一种当单个队列中任务执行完成之后再执行某个任务的方法dispatch_barrier_async

     //使用dispatch_barrier_async用来在并行队列都执行完之后,再执行的操作.
        dispatch_barrier_async(concurrentQueue, ^{
            //全部执行完再执行
            NSLog(@"2");
        });
    

    dispatch_sync:同步执行,不执行完不会返回返回结果。极其容易造成死锁,所以我们尽量避免使用,尤其是在主线程中!

    dispatch_apply:根据次数来向主线程中添加几次操作。

    dispatch_suspend:挂起指定的线程

    dispatch_resume:恢复指定的线程

    //同步的--在主线程中千万不要使用,否则会造成卡死
        dispatch_sync(concurrentQueue, ^{
            NSLog(@"byhuang");
        });
    
        //根据次数来指定,向队列中添加几次操作
        dispatch_apply(3, concurrentQueue, ^(size_t index) {
            NSLog(@"添加三次");
        });
       //指定挂起的队列
        dispatch_suspend(concurrentQueue);
        
        //恢复指定的队列
        dispatch_resume(concurrentQueue);
    

    我想上面这些操作已经足够我们的平常使用,最后一起学习共勉~

    我的个人博客地址byhuang的技术博客

    和简书一起同步更新~~

    相关文章

      网友评论

        本文标题:GCD的简单学习与使用

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