GCD的核心
- 将任务添加到队列
任务
: 执行什么操作队列
: 用来存放任务
代码演练
任务添加到队列分开写
- (void)gcdDemo1
{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
void (^task)() = ^ {
NSLog(@"%@",[NSThread currentThread]);
};
dispatch_async(queue, task);
NSLog(@"end");
}
简写
- (void)gcdDemo2
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
线程间通信
- (void)gcdDemo3
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"下载中... %@",[NSThread currentThread]);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"下载完成 %@",[NSThread currentThread]);
});
});
}
使用GCD的线程间通信实现异步下载网络图片
- (void)downloadImage
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url = [NSURL URLWithString:@"http://photocdn.sohu.com/20151209/mp47379110_1449633737507_2_th.png"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
[self.imageView sizeToFit];
[self.scrollView setContentSize:image.size];
});
});
}
总结 : 与 NSThread 的对比
- 所有的代码写在一起的,让代码更加简单,易于阅读和维护
- NSThread 通过 @selector 指定要执行的方法,代码分散
- GCD 通过 block 指定要执行的代码,代码集中
- 使用 GCD 不需要管理线程的创建/销毁/复用的过程.程序员不用关心线程的生命周期
- 如果要开多个线程 NSThread 必须实例化多个线程对象
- NSThread 靠 NSObject 的分类方法实现的线程间通讯,GCD 靠 block