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