GCD、及与NSOperationQueue的对比

1 queue

1.1 自定义队列

串行队列:队列中的任务只会顺序执行

dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t q = dispatch_queue_create("...", NULL);
复制代码

并行队列: 队列中的任务通常会并发执行

dispatch_queue_t q = dispatch_queue_create("......",DISPATCH_QUEUE_CONCURRENT);
复制代码

1.2 系统标准队列

全局队列:是系统的,直接GET。并行

dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
复制代码

主队列:每一个应用程序对应唯一主队列,直接GET。串行 主队列只会运行在主线程上,使用主队列更新UI。 主线程可以执行其他队列的任务。

dispatch_queue_t q = dispatch_get_main_queue();
复制代码

2 同步、异步,针对的是向前线程

dispatch_sync(_queue, ^() {
    //...
}
复制代码

3 dispatch_group

Case: 有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*任务a */ });
dispatch_group_async(group, queue, ^{ /*任务b */ });
dispatch_group_async(group, queue, ^{ /*任务c */ });
dispatch_group_async(group, queue, ^{ /*任务d */ });

//先提交,再用notify或者wait
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
// 在a、b、c、d异步执行完成后,会回调这里
});

//dispatch_group_wait(_loggingGroup, DISPATCH_TIME_FOREVER);
复制代码

顺序执行,queue用串行队列。

4 dispatch_barrier_async

  1. 在同一个queue(哪怕是并行队列)里面,执行顺序:barrier之前的任务、barrier任务、barrier之后的任务。
  2. 只在自定义队列上有效,在系统标准队列上,效果等同于dispatch_sync。
//不使用barrier时
dispatch_queue_t queue = dispatch_queue_create("queue_name", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务1-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务2-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务3-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务4-----%@", [NSThread currentThread]);
    });
复制代码

dispatch_queue_t queue = dispatch_queue_create("queue_name", DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务1-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务2-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务3-----%@", [NSThread currentThread]);
    });

    dispatch_barrier_async(queue, ^{
        NSLog(@"----barrier-----%@", [NSThread currentThread]);
    });

    dispatch_async(queue, ^{
        NSLog(@"----耗时任务4-----%@", [NSThread currentThread]);
    });

 dispatch_async(queue, ^{
        NSLog(@"----耗时任务5-----%@", [NSThread currentThread]);
    });
复制代码

5 dispatch_time

比NSTimer更精准

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC));

//dispatch_time的第二个参数的单位是纳秒

#define NSEC_PER_SEC 1000000000ull //每秒的纳秒数

复制代码

6 对比NSOperationQueue

6.1 NSOperationQueue与GCD之间的关系

GCD是纯C语言的API 。 NSOperationQueue是基于GCD的OC的封装。

6.2 两者的不同

  1. GCD只支持FIFO队列,NSOperationQueue可以重新设置优先级,最大并发数。
  2. NSOperationQueue可是方便设置operation之间的依赖关系,GCD则需要很多代码。
  3. NSOperationQueue支持KVO,即可以观察任务的执行状态,正在执行(isExecuted),是否结束(isFinished),是否取消(isCanceled)。

6.3 结论

  1. GCD更接近底层,而NSOperationQueue则更高级抽象。
  2. GCD速度更快。
  3. 任务之间的依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持。

转载于:https://juejin.im/post/5cf76dc1e51d45106b15fed4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值