GCD

/***
GCD(Grand Central Dispatch)
1.是最简单的一种多线程实现的方式。同时也是执行效率最高的一种方式(全部是用C语言代码编写的API),也是苹果公司最推崇的一种多线程实现方式
2.GCD 也是通过query来实现多线程
3.GCD 里面有两种query:
一种是串行队列:serial query;
一种是并列队列:concurrent queue;

*/

//serial query(串行队列)特点:第一个任务执行完毕,第二个任务才可以开始,

serial query 两种获取方式
第一种:
//创建不加*因为dispatch_queue_t...API是用c语言写的     
dispatch_queue_t queue = dispatch_get_main_queue();

第二种
自己创建的队列 (这种方式会自动创建一个子线程去完成队列里面的任务);
第一个参数是队列的名字(苹果推荐使用反向域名去命名)第二个参数是队列的类型(串行还是并行)
dispatch_queue_t queue =  dispatch_queue_create("com.lanou.mySerial", DISPATCH_QUEUE_SERIAL);

//往队列里面添加任务(dispatch_async是异步)
    dispatch_async(queue, ^{
        NSLog(@"这是第一个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"这是第2个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });

并行队列
特点:下一个任务不等上一个执行完毕就开始执行,后面的执行跟前面没关系(先执行的任务不一定先执行完,后面的任务也不一定最后执行完),并行队列会根据队列里的任务数量、cpu使用情况、内存消耗情况,开辟最合适的线程数量去完成队列里面的任务

并行队列也有两种创建方式
global_queue 是苹果里面的全局变量(总共三个全局队列,都是并发的队列);每个队列有4个优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND;
DISPATCH_QUEUE_PRIORITY_DEFAULT;
DISPATCH_QUEUE_PRIORITY_HIGH;
DISPATCH_QUEUE_PRIORITY_LOW;

//    第一种方式
//    第一个就是队列的优先级,第二个参数是苹果预留的为了以后去使用,目前没有用到 填写0
    dispatch_queue_t oneQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(oneQueue, ^{
        NSLog(@"这是第1个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });


dispatch_queue_t oneQueue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

 dispatch_async(oneQueue1, ^{
        NSLog(@"这是第2个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
    });


//    第二种创建并发队列的方式
    dispatch_queue_t queue = dispatch_queue_create("com.lanou3g.myqueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
       NSLog(@"这是第1个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
   });

 dispatch_async(queue, ^{
       NSLog(@"这是第2个任务%@ %d",[NSThread currentThread],[[NSThread currentThread] isMainThread]);
 });

dispatch_group 分组并发

dispatch_group通常有两种用法,
    1:dispatch_group_async(group, queue, ^{
        });
       在block中 如果是网络请求,在请求已发出时,就算执行完毕了,并不会等待回调,所以不能使用这个,采用下面的方法

    2:使用dispatch_group_enter(group)和dispatch_group_leave(group)
    使用这种方式使用更为灵活,enter和leave必须配合使用,有几次enter就要有几次leave,否则group会一直存在。当所有enter的block都leave后,会执行dispatch_group_notify的block。

我们当然可以在网络请求前enter,在执行完每个请求的成功回调后leave,再在notify中执行内容加载,这样看来问题就解决了,就像这样
//创建全局并行
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    for (MapDistnceModel *model in array) {

        dispatch_group_async(group, queue, ^{
            dispatch_group_enter(group);    // enter
            model.finishedBock = ^{// 此处是网络请求回调
                dispatch_group_leave(group); // leave
            };
            [model searchLine];// 网络请求
        });
    }

    dispatch_group_notify(group, queue, ^{
        // 最后执行的代码
        [self sortMinInsert:array column:column];
    });

参考自:http://www.jianshu.com/p/657e994aeee2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值