#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)startBtn:(UIButton *)sender {
NSDate* startTime = [NSDate date];// 记录开始时间
// 使用GCD开启一个异步的方法
// 第一个参数就是我们把这个异步开启到哪一个可用的队列里
// 第二个参数就是要在这个队列里执行的代码块,代码块里就是我们要处理的耗时的代码段
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString* getString = [self getMessageFromServer];
NSString* newString = [self processData:getString];
__block NSString* first = nil;
__block NSString* second = nil;
// 把一些希望并行却又无法确定何时能够全部完成的任务放到组里
// 先创建一个组变量
dispatch_group_t group = dispatch_group_create();
// 再使用异步函数,指定组和组所在队列,并且指定组内要执行的代码段
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
first = [self firstResult:newString];
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
second = [self secondResult:newString];
});
// 当组内的任务全部完成的时候,就会执行这个函数里的代码块
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
// 当观察的组内所有代码全部执行完成后,要执行的代码段
//再使用dispatch_async抓去一个队列,这次抓取的是一个主线程的队列
// 代码块里就是本次抓取到的主线程队列里要执行的代码段
dispatch_async(dispatch_get_main_queue(), ^{
// 更新ui
NSString* resultString = [NSString stringWithFormat:@"first:%@\nsecond:%@",first,second];
self.textView.text = resultString;
NSDate* endTime = [NSDate date];// 记录结束时间
NSTimeInterval interval = [endTime timeIntervalSinceDate:startTime];
NSLog(@"运行完成,耗时%.2f秒",interval);
});
});
});
}
// 假设这里有一个请求的工作,耗时1秒
- (NSString*)getMessageFromServer
{
[NSThread sleepForTimeInterval:1];
return @"This is a message from server";
}
// 假设请求到数据后又做了一个解析,耗时2秒
- (NSString*)processData:(NSString*)data
{
[NSThread sleepForTimeInterval:2];
return [data uppercaseString];
}
// 假设算出数据的大小耗时3秒
- (NSString*)firstResult:(NSString*)data
{
[NSThread sleepForTimeInterval:3];
NSInteger length = [data length];
NSString* str = [NSString stringWithFormat:@"%d",length];
return str;
}
// 假设替换数据中的某些数据耗时4秒
- (NSString*)secondResult:(NSString*)data
{
[NSThread sleepForTimeInterval:4];
NSString* newStr = [data stringByReplacingOccurrencesOfString:@"S" withString:@"s"];
return newStr;
}
@end