现在的位置: 首页 > 综合 > 正文

iOS 多线程之GCD的简单使用

2017年02月26日 ⁄ 综合 ⁄ 共 1485字 ⁄ 字号 评论关闭

最近在开发中发现好多地方代码用到了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()
判断加载完没让程序回到主线程显示很重要。
 知道这个以后看到这样的代码就不会有疑问了。


抱歉!评论已关闭.