突然接觸了IOS,來到了一個瑰麗的世界,沒想到剛開始工作用到的就是大學唯一一丁點都沒有接觸的東西,sad!
抒情打住……
OC也是第一次接觸,so~~這麼一隻菜鳥,使用了Apress兩本經典作爲入門基礎:David Mark《精通IOS開發》+Scott Knaster《Objective-C》。這兩本書,水果味的,嘿!之前的筆記都記在了“有道”上,記得不詳細,所以冒出在博客上寫的想法,可能會督促自己認真一些,邊學習邊記錄了。代碼的例子用教材中的,然後加上自己的註釋和理解。
1.代碼塊
<pre name="code" class="objc">//聲明一個返回值爲空,參數爲空的塊變量
void (^loggerBlock)(void)
__block int a=0;
int b=1;
loggerBlock^{
<span style="white-space:pre"> </span>a=9;
<span style="white-space:pre"> </span>nslog(@"%d",b);
}
//執行
loggerBlock();
2.GCD處理
//1.聲明GCD隊列
dispatch_queue_t globalQueue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT/HIGH/LOW);
//2.實現希望後臺運行的代碼塊
dispatch_async ( globalQueue , ^{
//do something in 後臺線程
3//得到希望的數據後,回到主線程進行更新
dispatch_async (dispatch_get_main_queue() , ^{
do something in 主線程
});
});
-(void)doWork:(id)sender{
self.resultsTextView.text = @"";
NSDate *startTime = [NSDate date];
//後臺處理的時候button不可按,並且出現加載動畫
self.startButton.enabled = NO;
[self.spinner startAnimating];
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(globalQueue, ^{
@try{
NSString *fetchedData = [self fetchSomethingFromServer];
NSString *processData = [self processData:fetchedData];
NSString *firstData = [self calculateFirstResult:processData];
NSString *secondData = [self calculateSecondResult:processData];
NSString *resultData = [NSString stringWithFormat:@"%@ \n %@",firstData,secondData];
//update in main queue
dispatch_async(dispatch_get_main_queue(), ^{
self.resultsTextView.text = resultData;
self.startButton.enabled = YES;
[self.spinner stopAnimating];
});
NSDate *endTime = [NSDate date];
NSLog(@"Complete in %f time",[endTime timeIntervalSinceDate:startTime]);
}@catch (NSException *e){
NSLog(@"%@",e);
}
});
}
dispatch_queue_t globalQueue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT/HIGH/LOW);
dispatch_async ( globalQueue , ^{
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group , queue,^{
function1();
});
dispatch_group_async(group , queue,^{
function2();
});
dispatch_async_notify(group , queue , ^{
dispatch_async (dispatch_get_main_queue() , ^{
do something in 主線程
});
});
});
運用到例子中就是<pre name="code" class="objc">-(void)doWork2:(id)sender{
self.resultsTextView.text = @"";
NSDate *startTime = [NSDate date];
//後臺處理的時候button不可按,並且出現加載動畫
self.startButton.enabled = NO;
self.startButton.alpha = 0.5;
[self.spinner startAnimating];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSString *fetchedData = [self fetchSomethingFromServer];
NSString *processData = [self processData:fetchedData];
//NSString *firstData = [self calculateFirstResult:processData];
//NSString *secondData = [self calculateSecondResult:processData];
//NSString *resultData = [NSString stringWithFormat:@"%@ \n %@",firstData,secondData];
__block NSString *firstData;//need to be assigned in block
__block NSString *secondData;
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
<span style="white-space:pre"> </span>firstData = [self calculateFirstResult:processData];//firstData需在塊內進行賦值,所以要聲明成__block變量,兩個"_"哦
});
dispatch_group_async(group, queue, ^{
secondData = [self calculateSecondResult:processData];
});
dispatch_group_notify(group, queue, ^{
NSString *resultData = [NSString stringWithFormat:@"%@\n%@",firstData,secondData];
//update in main queue
dispatch_async(dispatch_get_main_queue(), ^{
self.resultsTextView.text = resultData;
self.startButton.enabled = YES;
self.startButton.alpha = 1.0;
[self.spinner stopAnimating];
});
NSDate *endTime = [NSDate date];
NSLog(@"Complete in %f time",[endTime timeIntervalSinceDate:startTime]);
});
}
});
}
寫不下去了,明天再補吧,回家睡覺