zoukankan      html  css  js  c++  java
  • GCD-02(其他用法)

      

    /**

         * 做延时操作的事情

         */

        [self delay];

        /**

         * 做一次性代码,touchesBegan方法

         */

        

        /**

         * 队列组使用需求:

         * 首先:分别异步执行2个耗时的操作

         * 其次:等两个异步操作都执行完毕后,在回到主线程执行操作

         */

        [self downLoadImage];

        // 图片1: http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg

        // 图片2: http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg

        /**

         1.下载图片1和图片2

         

         2.将图片1和图片2合并成一张图片后显示到imageView上

         

         思考:

         * 下载图片 : 子线程

         * 等2张图片都下载完毕后, 才回到主线程

         */

    #pragma mark - 延时操作

    - (void)delay {

        //1.延时执行(iOS中有两种)

        //1:调用NSObject的方法;2秒后在当前线程调用self的run方法

        [self performSelector:@selector(run) withObject:nil afterDelay:2.0];

        //2.利用GCD延时执行,这个是在主线程中, 也可以使用并发队列使在子线程中做

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));//时间的计算函数

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

            NSLog(@"GCD---%@", [NSThread currentThread]);

        });

    }

    - (void)run {

        NSLog(@"run---%@", [NSThread currentThread]);

    }

    #pragma mark - 一次性代码

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

        //这种也会有问题, 需要弄一个全局变量

    //    if (self.log == NO) {

    //        NSLog(@"第一次---touchesBegan");

    //        self.log = YES;

    //    }

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken, ^{

            NSLog(@"第一次---touchesBegan");

        });

    }

    #pragma mark - 队列组

    - (void)downLoadImage {

        //第一种, 将任务写到一个队列执行, 时间长,效率低

        /*

        dispatch_async(global_queue, ^{

            //下载图片1

            UIImage *image1 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

            //下载图片2

            UIImage *image2 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg"];

            dispatch_async(main_queue, ^{

                self.imageView1.image =image1;

                self.imageView2.image =image2;

                //合并

                UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);

                [image1 drawInRect:CGRectMake(0, 0, 100, 100)];

                [image2 drawInRect:CGRectMake(100, 0, 100, 100)];

                self.BigImageView.image = UIGraphicsGetImageFromCurrentImageContext();

                //关闭上下文

                UIGraphicsEndImageContext();

            });

        });

        */

        //第二种

        //1.创建一个组

        dispatch_group_t group = dispatch_group_create();

        //2.开启任务1下载图片1

        __block UIImage *image1 = nil;

        dispatch_group_async(group, global_queue, ^{

            image1 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/2a1009253cf9fc7c97893a4f0fe3a7b1.jpg"];

        });

        //2.开启任务2下载图片2

        __block UIImage *image2 = nil;

        dispatch_group_async(group, global_queue, ^{

            image2 = [self imageWithURL:@"http://news.baidu.com/z/resource/r/image/2014-06-22/b2a9cfc88b7a56cfa59b8d09208fa1fb.jpg"];

        });

        //等group中的所有任务都执行完毕,在执行其他操作

        dispatch_group_notify(group, main_queue, ^{

            self.imageView1.image = image1;

            self.imageView2.image = image2;

            //合并

            UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);

            [image1 drawInRect:CGRectMake(0, 0, 100, 100)];

            [image2 drawInRect:CGRectMake(100, 0, 100, 100)];

            self.BigImageView.image = UIGraphicsGetImageFromCurrentImageContext();

            //关闭上下文

            UIGraphicsEndImageContext();

        });

    }

    - (UIImage *)imageWithURL:(NSString *)urlString {

        NSURL *url = [NSURL URLWithString:urlString];

        NSData *data = [NSData dataWithContentsOfURL:url];

        return [UIImage imageWithData:data];

    }

  • 相关阅读:
    头文件里面的ifndef /define/endif的作用
    互联网小知识
    IT技术开发人员获得成功的六大步骤
    ab网站压力测试
    微软校招试题
    C程序编译过程浅析
    makefile变量赋值
    printf的题目
    Oracle命名规范
    javascript(js)小数精度丢失的解决方案
  • 原文地址:https://www.cnblogs.com/guofuzhang/p/5198655.html
Copyright © 2011-2022 走看看