GCD的简单学习与使用

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 ,如果

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

    //自定义一个队列
    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的简单学习与使用)