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.输出结果