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 (@
|