zoukankan      html  css  js  c++  java
  • iOS GCD

    1. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
    2. //耗时的操作
    3.     NSURL * url = [NSURL URLWithString:@"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"];  
    4.     NSData * data = [[NSData alloc]initWithContentsOfURL:url];  
    5.     UIImage *image = [[UIImage alloc]initWithData:data];  
    6.     if (data != nil) {  
    7.         dispatch_async(dispatch_get_main_queue(), ^{  
    8.  //刷新数据
    9.             self.imageView.image = image;  
    10.          });  
    11.     }  
    12. });  
    13. 系统给每一个应用程序提供了三个concurrent dispatch queues。这三个并发调度队列是全局的,它们只有优先级的不同。因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列,如下:

      1.dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);    

       这里也用到了系统默认就有一个串行队列main_queue

      2.dispatch_queue_t mainQ = dispatch_get_main_queue();    

      虽然dispatch queue是引用计数的对象,但是以上两个都是全局的队列,不用retain或release。

    2.使用Dispatch Group异步下载两张图片

    @interface ViewController ()

    @property (nonatomic, strong) UIImage *imageOne;

    @property (nonatomic, strong) UIImage *imageTwo;

    @property (nonatomic, weak) UILabel *textLabel;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        

        [self operation1];

    }

    - (void)operation1

    {

        UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 450, 0, 0)];

        textLabel.text = @"正在下载图片";

        [textLabel sizeToFit];

        [self.view addSubview:textLabel];

        self.textLabel = textLabel;

        [self group];

        NSLog(@"在下载图片的时候,主线程貌似还可以干点什么");

    }

    - (void)group

    {

        UIImageView *imageView = [[UIImageView alloc] init];

        [self.view addSubview:imageView];

    dispatch_group_t group = dispatch_group_create();

    dispatch_queue_t queue = dispatch_queue_create("com.wuniu.www", DISPATCH_QUEUE_CONCURRENT);

    dispatch_group_async(group, queue, ^{

        NSLog(@"正在下载第一张图片");

        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img3.imgtn.bdimg.com/it/u=3484903974,2907035455&fm=206&gp=0.jpg"]];

        NSLog(@"第一张图片下载完毕");

        self.imageOne = [UIImage imageWithData:data];

    });

    dispatch_group_async(group, queue, ^{

        NSLog(@"正在下载第二张图片");

        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://img4.imgtn.bdimg.com/it/u=2718132976,3419769724&fm=206&gp=0.jpg"]];

        NSLog(@"第二张图片下载完毕");

        self.imageTwo = [UIImage imageWithData:data];

    });

    dispatch_group_notify(group, queue, ^{

        UIGraphicsBeginImageContext(CGSizeMake(400, 200));

        

        [self.imageOne drawInRect:CGRectMake(0, 0, 150, 200)];

        [self.imageTwo drawInRect:CGRectMake(150, 0, 150, 200)];

        

        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        

        dispatch_async(dispatch_get_main_queue(), ^{

            UIImageView *imageView = [[UIImageView alloc] initWithImage:newImage];

            [self.view addSubview:imageView];

            self.textLabel.text = @"图片合并完毕";

        });

    });

    }

    //打印输出

    2016-08-18 15:26:27.750 LX[66966:7575374] 正在下载第一张图片

    2016-08-18 15:26:27.750 LX[66966:7575372] 正在下载第二张图片

    2016-08-18 15:26:27.750 LX[66966:7575341] 在下载图片的时候,主线程貌似还可以干点什么

    2016-08-18 15:26:28.076 LX[66966:7575372] 第二张图片下载完毕

    2016-08-18 15:26:28.080 LX[66966:7575374] 第一张图片下载完毕

  • 相关阅读:
    快速幂&欧拉降幂
    欧拉函数
    素数打表-筛法
    多源最短路径问题(Floyd算法)
    蓝桥杯-本质上升序列
    蓝桥杯-玩具蛇
    SDUT-计算机组成原理
    取消U盘和移动硬盘的GPT保护分区
    Windows 10 上运行 photoshop 等软件出现 loadlibrary failed with error 87 的解决方法!
    做题笔记
  • 原文地址:https://www.cnblogs.com/liuting-1204/p/5782993.html
Copyright © 2011-2022 走看看