GCD大神的總結
1. 關於Block
void (^loggerBlock)(void); // 聲明一個Block
loggerBlock =^{
//add your code
} ;
2、關於變量
在block中可以使用定義程序塊可以訪問的變量,但此時Block中的變量只是定義程序塊可以訪問的變量的一個COPY ,若要共享定義程序塊可以訪問的變量,此時需要使用__block關鍵字對變量進行修飾,如: __block NSString *firstResult;3,使用dispatch_group_async把block加入到隊列中運行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//add your code
});
4、對於Block中的代碼不能操作UI線程,否則就違背了線程安全原則,可以使用下面的方式對UI進行操作
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *fetchedData =[self fetchSomeThingFromServer];
…………
dispatch_async(dispatch_get_main_queue(), ^{
//add your UI code
});
}
5、關於Block併發,使用dispatch_group_t,如下所示:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSString *fetchedData =[self fetchSomeThingFromServer];
NSString *processedData = [self processData:fetchedData];
__block NSString *firstResult;
__block NSString *secondResult;
dispatch_group_t group = dispatch_group_create();
//處理併發1
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
firstResult = [[self calculateFirstResult:processedData] retain];
});
//處理併發1
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
secondResult = [[self calculateSecondResult:processedData] retain];
});
//dispatch_group_notify指定的是該組所有併發塊執行完後執行的代碼
dispatch_group_notify(group,dispatch_get_global_queue(0, 0),^{
NSDate *endTime =[NSDate date];
NSLog(@"%f------",[endTime timeIntervalSinceDate:startTime]);
[firstResult release];
[secondResult release];
});
});