首页 > 代码库 > GCD(2)
GCD(2)
```objc
import "ViewController.h"
@interface ViewController () @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *action;
@end
@implementation ViewController
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. }
//模拟从服务器上获取数据(返回字符串) -(NSString *)loadingSomeThingFromServer { [NSThread sleepForTimeInterval:2];
return @"Hello wangdelong";
}
// 将传入参数全部转换成大写字母 -(NSString *)changname:(NSString *)result { [NSThread setThreadPriority:2];
return [result uppercaseString];
}
//模拟从服务器上第一次处理数据(将从服务器上返回的字符串长度转换成字符串:(Number of chars: ) -(NSString *)dealTheResult:(NSString *)result { [NSThread sleepForTimeInterval:3];
return [NSString stringWithFormat:@"long of zhe thinge is :%d",result.length];
}
//模拟第二次处理服务器上的数据,将返回的字符串里的小的w转换成大写的W -(NSString *)dealTheNewThings:(NSString *)result { [NSThread sleepForTimeInterval:3];
return [result stringByReplacingOccurrencesOfString:@"W" withString:@"w"];
}
- (IBAction)doSomething:(UIButton *)sender {
// 声明一个表示时间的对象,[NSDate date]获取的是当前时间 NSDate *startTime = [NSDate date];
[self.action startAnimating];
// 创建一个队列,使其实现并发-----原以为能实现风火轮的准时停止,但是 dispatchqueuet queue = dispatchgetglobalqueue(DISPATCHQUEUEPRIORITYDEFAULT, 0);
// 异步发布 dispatch_async(queue, ^{
// //从服务器上取数据 __block NSString *result = nil;
dispatch_async(queue, ^{
// 处理事件
result = [self loadingSomeThingFromServer];
NSLog(@"********输入的是:%@",result);
});
result = [self changname:result];
// 第一次处理数据
NSString *second = [self dealTheResult:result];
// 第二次处理数据
NSString *third = [self dealTheNewThings:result];
NSLog(@"********大写的是:%@",result);
NSLog(@"********:%@",second);
NSLog(@"********修改后的是:%@",third);
NSDate *endTime = [NSDate date];
NSLog(@"共经过 %f m时间",[endTime timeIntervalSinceDate:startTime ]);
dispatch_sync(dispatch_get_main_queue(), ^{
[self.action stopAnimating];
});
});
}
//新添加的方法,显示最后的结果 -(void)showTheLastResult:(NSString *)first Second:(NSString *)second { NSLog(@"[First:]%@,[Second:]%@",first,second);
}
- (IBAction)doNewThing:(UIButton *)sender {
// 声明一个表示时间的对象,[NSDate date]获取的是当前时间 NSDate *startTime = [NSDate date]; [self.action startAnimating];
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 异步分发队列 dispatch_async(queue, ^{
NSString *result =[self loadingSomeThingFromServer];
NSString *changName = [self changname:result];
NSLog(@"********输入的是:%@",result);
NSLog(@"********大写的是:%@",changName);
// GCD提供了dispatch group,可以将一组任务集合在一起,等待这组任务完成后再继续, dispatchgroupt group =dispatchgroupcreate();
// __block这里是block的用法,为了能让block能传参数
__block NSString * first ;
__block NSString * second;
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
first = [self dealTheResult:changName];
NSLog(@"********:%@",first);
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
second = [self dealTheNewThings:changName];
NSLog(@"********修改后的是:%@",second);
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self showTheLastResult:first Second:second];
dispatch_sync(dispatch_get_main_queue(), ^{
[self.action stopAnimating];
});
NSLog(@"共经过 %f m时间",[[NSDate date] timeIntervalSinceDate:startTime]);
});
});
}
@end
```