zoukankan      html  css  js  c++  java
  • iOS开发-线程篇-GCD其他方法

    2016-3-18   今天首先更新一下有关于GCD的其他常见应用。
     

     1.GCD的应用 单例模式 这是我最开始接触的GCD应用 

    -(void)gcdTest1

    {

        static dispatch_once_t onceToken;

        dispatch_once(&onceToken,^{

            

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

        });

        

    }

     

    2.延迟操作  

           在需要进行延迟的操作设置时可以使用GCD方式 ,但是使用的比较少,因为写起来比较麻烦 所以了解一下即可 ,第一种使用方法比较多。

        

    -(void)gcdTest2

    {

        

        //1. 延迟操作方法1

        // [self performSelector:@selector(doAction) withObject:nil afterDelay:2];

        

        //2. 延迟操作方法2

       

        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2 * NSEC_PER_SEC));

        

        //此处的写成主队列 dispatch_get_main_queue()

        

        //    when dispatch_time_t

        dispatch_after(time, dispatch_get_main_queue(), ^{

            

            //打印当前的线程

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

        });

    }

     3.创建调度组方式一 ( **** )
             这个是CGD重要的应用,必须掌握,在开发中经常用到!(实现并发异步操作,即多线程执行)

    -(void)gcdTest3

    {

        

        // 创建调度组 ****  实现多线程 异步

        dispatch_group_t group = dispatch_group_create();

        

        //创建全局队列(并发)

        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

        

        //调度组进行异步请求 (异步进行 所以执行顺序不固定)

        dispatch_group_async(group, queue, ^{

            

            //设置时延

            [NSThread sleepForTimeInterval:2];

            

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

            

        });

        dispatch_group_async(group, queue, ^{

            

            //设置时延

            [NSThread sleepForTimeInterval:2];

            

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

            

        });

        dispatch_group_async(group, queue, ^{

            

            //设置时延

            [NSThread sleepForTimeInterval:2];

            

            NSLog(@"下载第三张图片");

            

        });

        dispatch_group_async(group, queue, ^{

            

            //设置时延

            [NSThread sleepForTimeInterval:2];

            

            NSLog(@"下载第四张图片");

            

        });

        

        //当所有异步请求完成时 调用dispatch_group_nofity

        dispatch_group_notify(group, queue, ^{

            

            NSLog(@"下载完成,更新UI");

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

            

        });

        

    }

    4.创建调度组的方式二  (对比上述方法看)

        

        1.等待调度队列wait相当于一个阻塞状态

            2.DISPATCH_TIME_FOREVER 时间是永远

        3.wait一直等待上面完成之后再执行

    -(void)gcdTest4

    {

        

        dispatch_group_t group = dispatch_group_create();

        

        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

        

        //进入队列

        dispatch_group_enter(group);

        dispatch_async(queue, ^{

            

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

            //离开队列

            dispatch_group_leave(group);

        });

       

       dispatch_group_enter(group);

        dispatch_async(queue, ^{

            

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

            dispatch_group_leave(group);

        });

        

       dispatch_group_enter(group);

        dispatch_async(queue, ^{

            

            NSLog(@"下载第三张图");

            dispatch_group_leave(group);

        });

        

       dispatch_group_enter(group);

        dispatch_async(queue, ^{

            

            NSLog(@"下载第四张图");

            dispatch_group_leave(group);

        });

        

      

        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

        

        NSLog(@"更新UI");

    }

     

    5.中断操作

          注意这里使用 dispatch_barrier_async 的时候 必须使用自定义的并发队列 使用全局队列不好使

    -(void)gcdTest5

    {  

        //创建一个并发队列

         dispatch_queue_t queue = dispatch_queue_create("Chen-iOS", DISPATCH_QUEUE_CONCURRENT);

        //异步

        dispatch_async(queue, ^{

            //设置时间延迟

            [NSThread sleepForTimeInterval:2];

            NSLog(@"1");

        });

        dispatch_async(queue, ^{

            //设置时间延迟

            [NSThread sleepForTimeInterval:1];

            NSLog(@"2");

        });

        dispatch_async(queue, ^{

            //设置时间延迟

            [NSThread sleepForTimeInterval:3];

            NSLog(@"3");

        });

        

        //添加中断操作

        //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

         

        dispatch_barrier_async(queue, ^{

            

            NSLog(@"-=-=-=-=-=-=-=-=-=-=-=-=-=-=");

            [NSThread currentThread];

            

        });

        

        //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//

        

        dispatch_async(queue, ^{

            //设置时间延迟

            [NSThread sleepForTimeInterval:5];

            NSLog(@"4");

        });

        dispatch_async(queue, ^{

            //设置时间延迟

            [NSThread sleepForTimeInterval:4];

            NSLog(@"5");

        });

        

    }

     
    实现结果:
     

    6.遍历操作

    -(void)gcdTest6

    {

        //创建一个全局的队列

        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

        

        //iterations 遍历的次数

        dispatch_apply(5, queue, ^(size_t i) {

            

            NSLog(@"%@",@(i));

            

        });

    }

     
     
     
     
     
  • 相关阅读:
    CentOS优化
    C++ 与OpenCV 学习笔记
    常用ubuntu命令
    对极几何笔记
    DBoW2 词袋模型笔记
    OKVIS(一)初始化流程及代码结构
    二进制描述子 BRIEF(ORB), BRISK, FREAK
    VIO 初始化小结
    VINS(十)FeatureManager(未完待续)
    VINS(九)Ceres Solver优化(未完待续)
  • 原文地址:https://www.cnblogs.com/Horkly/p/Horkly_GCD.html
Copyright © 2011-2022 走看看