http://blog.devtang.com/2012/02/22/use-gcd/ 唐巧对于原生GCD的理解
串行队列 & 并发队列
//创建队列
GCDQueue *queue = [[GCDQueue alloc] initConcurrent]; //initSerial 串行队列 initConcurrent 并发队列
GCD线程组
//等线程1和线程2执行完了之后,执行线程3
GCDGroup *group = [[GCDGroup alloc] init];
GCDQueue *queue = [[GCDQueue alloc] initConcurrent];
[queue execute:^{
sleep(1);
NSLog(@"线程1开始执行");
} inGroup:group];
[queue execute:^{
sleep(3);
NSLog(@"线程2开始执行");
} inGroup:group];
[queue notify:^{
NSLog(@"线程3开始执行");
} inGroup:group];
GCD定时器
/**
* GCDTimer 精准度比NSTimer低。
如果NSTimer用在改变UITableView上会出现一些问题,这个使用GCDTimer就没有问题
*
*/
self.gcdTimer = [[GCDTimer alloc] initInQueue:[GCDQueue mainQueue]];
[self.gcdTimer event:^{
NSLog(@"GCD定时器");
} timeInterval:NSEC_PER_MSEC];
[self.gcdTimer start];
GCD延时执行
// GCD延时执行操作缺点:延时精确度不是特别高,而且无法取消延时操作。
// 优点:代码简介,简练
//NSThread方式精确度高,并且可以取消延时操作
//缺点:写代码比较麻烦。
//NSThread方式的延时执行方式
[self performSelector:@selector(thradEvent:) withObject:self afterDelay:2.0f];
//取消延时执行操作
[NSObject cancelPreviousPerformRequestsWithTarget:self];
//GCD方式的延时执行操作
[GCDQueue executeInMainQueue:^{
NSLog(@"GCD线程事件");
} afterDelaySecs:2.0f];
- (void)thradEvent:(id)sender{
NSLog(@"线程事件");
}
GCD信号组
/**
* 线程1和线程2同时执行线程。当线程2执行到wait,那么就会线程阻塞。当线程1发送信号的时候,然后线程2才继续执 行。 也就是把异步转化为同步线程。
*/
GCDSemaphore *semaphore = [[GCDSemaphore alloc] init];
[GCDQueue executeInGlobalQueue:^{
//发送信号
[semaphore signal];
NSLog(@"线程1");
}];
[GCDQueue executeInGlobalQueue:^{
//等待信号
[semaphore wait];
NSLog(@"线程2");
}];
Ps:详情参考极客学院GCD编程。