GCD之全局、主线程
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
-(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.按钮执行方法顺序如下:
|
1
2
3
4
5
6
7
8
|
- (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 <br> //4.DISPATCH_QUEUE_PRIORITY_BACKGROUND |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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.输出结果


浙公网安备 33010602011771号