最近在开发中发现好多地方代码用到了dispatch_get_global_queue,dispatch_get_main_queue,这些其实就是GCD的使用,在学习GCD时根据这篇文章来学习了http://blog.csdn.net/totogo2010/article/details/8016129 。
对于里面的代码 我重新做了一些测试来验证GCD的作用。
主要代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
NSData * data = [[NSData alloc]initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc]initWithData:data];
if (data != nil) {
//图片下载完成后 回到主线程 显示图片
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
}
});
运行结果:
这段代码 主要的功能是从url文件中加载一张图片,等图片加载完了以后就跳到主线程。可能有些还不够明白,下面是我的理解,dispatch_get_global_queue 的意思得到全局的队列,
NSData * data = [[NSData alloc]initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc]initWithData:data];
这两句代码 在另外一个线程中处理这些操作,等操作完了就会回到主线程来。
下面如果不加这个dispatch_async(dispatch_get_main_queue()的话
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];
NSData * data = [[NSData alloc]initWithContentsOfURL:url];
UIImage *image = [[UIImage alloc]initWithData:data];
if (data != nil)
{
//图片下载完成后 回到主线程 显示图片
//dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
// });
}
});
运行结果是这样的:从这个现象可以看出 当我们的图片在另外一个线程加载时,图片视图并没有等待加载完了再去显示还是直接显示,当时的图片还没有数据,所有只显示成这样。 所以 dispatch_async(dispatch_get_main_queue() 判断加载完没让程序回到主线程显示很重要。 知道这个以后看到这样的代码就不会有疑问了。