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