-(NSString *)fetchData
{
[NSThread sleepForTimeInterval:1];
return @"Hello world";
}
-(NSString *)firstCast:(NSString *)data
{
[NSThread sleepForTimeInterval:2];
return [data uppercaseString];
}
-(NSString *)secondCast:(NSString *)data
{
[NSThread sleepForTimeInterval:3];
return [data stringByReplacingOccurrencesOfString:@"0" withString:@"o"];
}
-(NSInteger)thrid:(NSString *)data
{
[NSThread sleepForTimeInterval:4];
return [data length];
}
1.在View中放置一个UIButton按钮和一个UITextView,在按钮点击事件中调用上面的方法
2.按钮执行方法顺序如下:
- (IBAction)btnclick:(id)sender {
//__block 声明变量可在block中修改 否则只有只读权限
__block int a=10;
NSDate *startTiem=[NSDate date];
//对于全局队列(并行队列) 声明时第一个参数有三种:四种对应的是不同的全局队列 第二个参数目前未使用 始终为0
//1.DISPATCH_QUEUE_PRIORITY_DEFAULT
//2.DISPATCH_QUEUE_PRIORITY_HIGH
//3.DISPATCH_QUEUE_PRIORITY_LOW
//4.DISPATCH_QUEUE_PRIORITY_BACKGROUND
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];
NSString *secondstring=[self secondCast:firststring];
NSInteger length =[self thrid:fetchstring];
NSDate *endtime=[NSDate date];
//对于UI的更新获取值都在主线程中 此时要用主线程来更新 主 线程是串行队列
dispatch_async(dispatch_get_main_queue(), ^{
self.textview.text=secondstring;
});
a=9;//若未在声明变量时使用__block 时将会报错不能编译
NSLog(@"%@",[NSString stringWithFormat:@"%ld %@",length,secondstring]);
NSLog(@"%f",[endtime timeIntervalSinceDate:startTiem]);
});
}
3.输出结果