GCD的线程间的通讯
- 刷新UI必须在主队列中刷新
- 如果在子队列中刷新可能会不显示刷新结果
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"--------");
// 1.除主队列以外, 随便搞一个队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 2.调用异步函数
dispatch_async(queue, ^{
// 1.下载图片
NSURL *url = [NSURL URLWithString:@"http://pic.4j4j.cn/upload/pic/20130531/07ed5ea485.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
// 2.将二进制转换为图片
UIImage *image = [UIImage imageWithData:data];
// 3.回到主线程更新UI
// self.imageView.image = image;
/*
技巧:
如果想等UI更新完毕再执行后面的代码`设置图片完毕`, 那么使用同步函数
如果不想等UI更新完毕就需要执行后面的代码`设置图片完毕`, 那么使用异步函数
*/
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
NSLog(@"设置图片完毕 %@", image);
});
}
小技巧
在解决死锁的时候 / 异步并发中调用主队列(调用方式的选择:同步/异步)
- 如果想等UI更新完毕再执行后面的代码
设置图片完毕
, 那么使用同步函数
- 如果不想等UI更新完毕就需要执行后面的代码
设置图片完毕
, 那么使用异步函数
// 1.除主队列以外, 随便搞一个队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 2.调用异步函数
dispatch_async(queue, ^{
// 1.下载图片
NSURL *url = [NSURL URLWithString:@"http://pic.4j4j.cn/upload/pic/20130531/07ed5ea485.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
// 2.将二进制转换为图片
UIImage *image = [UIImage imageWithData:data];
/*
技巧:
如果想等UI更新完毕再执行后面的代码`设置图片完毕`, 那么使用同步函数
如果不想等UI更新完毕就需要执行后面的代码`设置图片完毕`, 那么使用异步函数
*/
dispatch_sync(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
NSLog(@"设置图片完毕 %@", image);
});