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];
});
});