1.问题的提出

在上面的GCD之全局、主线程中介绍了dispatch_get_global_queue、dispatch_get_main_queue的用法,可以看到最后执行的时间在10s 左右,在上面的例子只是将任务转到后台,变成后台任务执行,同时-(NSString *)secondCast:(NSString *)data和-(NSInteger)thrid:(NSString *)data两个方法可以不分先后顺序同时执行,那就是能不能让他们平行执行来提高效率呢?这时就有了GCD之Group的出现。Group将block追加到对应的线程队列上,和后面要介绍的diapatch_apply类似。

2.下面是Group的使用例子(在GCD之全局、主线程的基础上做了一些修改)

NSDate *startTiem=[NSDate date];
    //对于全局队列 声明时第一个参数有三种:三种对应的是不同的全局队列 第二个参数目前未使用 始终为0
    //1.DISPATCH_QUEUE_PRIORITY_DEFAULT
    //2.DISPATCH_QUEUE_PRIORITY_HIGH
    //3.DISPATCH_QUEUE_PRIORITY_LOW
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    //dispatch_async 开启异步线程
    dispatch_async(queue, ^{
        NSString *fetchstring= [self fetchData];
        NSString *firststring=[self firstCast:fetchstring];
        //创建dispatch_group_t
        dispatch_group_t group= dispatch_group_create();
        __block NSString *secondstring;
        __block NSInteger length;
        //通过dispatch_group_async来开启任务
        dispatch_group_async(group, queue, ^{
            secondstring=[self secondCast:firststring];
        });
        dispatch_group_async(group, queue, ^{
             length =[self thrid:fetchstring];
        });
        //dispatch_group_notify 等待Group中其他任务完成后再运行
        dispatch_group_notify(group, queue, ^{
            NSDate *endtime=[NSDate date];
            //对于UI的更新获取值都在主线程中 此时要用主线程来更新
            dispatch_async(dispatch_get_main_queue(), ^{
                self.textview.text=secondstring;
            });
            NSLog(@"%@",[NSString stringWithFormat:@"%ld  %@",length,secondstring]);
            NSLog(@"%f",[endtime timeIntervalSinceDate:startTiem]);
        });
    });

3.运行结果此时只用了7s

GCD之Group-LMLPHP

05-08 14:50