iOS 多线程之GCD的简单使用

最近在开发中发现好多地方代码用到了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;

             });

        }

    });

运行结果:

iOS 多线程之GCD的简单使用_第1张图片

这段代码 主要的功能是从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;

          //  });

        }

    });

运行结果是这样的:

iOS 多线程之GCD的简单使用_第2张图片

从这个现象可以看出 当我们的图片在另外一个线程加载时,图片视图并没有等待加载完了再去显示还是直接显示,当时的图片还没有数据,所有只显示成这样。 所以 dispatch_async(dispatch_get_main_queue() 判断加载完没让程序回到主线程显示很重要。 知道这个以后看到这样的代码就不会有疑问了。


你可能感兴趣的:(iOS 多线程之GCD的简单使用)