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