zoukankan      html  css  js  c++  java
  • GCD 初步学习

    GCD应该是比較牛逼的东西了吧,一时半会应该是操作不好。

    在cocoa-china上面有两篇关于GCD的文章。GCD 深入理解(一) GCD 深入理解(二)

    CSDN荣芳志博客:点击打开链接

    我仅仅是读了第一篇文章,在这对里面讲的几个操作函数做一下记录:

    GCD是用来优化程序支持多核处理器和多处理系统的系统,建立在线程池模式上。

    原理是:将任务(函数或者block)放入队列,队列(先进先出)有两种:并行和串行;

    串行队列-队列中的任务是串行的。执行完一个后接着执行下一个。可是队列与队列之间是并行的

    并行队列-队列中的任务是并行的。所以结束的顺序不确定。


    系统提供了四个全局并发队列 有不同的优先级background、low、default 以及 high 

    #define DISPATCH_QUEUE_PRIORITY_HIGH        2
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT     0
    #define DISPATCH_QUEUE_PRIORITY_LOW         (-2)
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND  INT16_MIN
    系统还提供给你一个叫做主队列的特殊队列。是一个串行队列,主要用与UI更新。


    经常用法:


    我们自己能够来创建队列

    <span style="font-family:SimSun;font-size:12px;">dispatch_queue_t queue=dispatch_queue_create("queue1", DISPATCH_QUEUE_SERIAL);</span>

    第一參数是队列的名字。第二个參数有两种DISPATCH_QUEUE_SERIAL。DISPATCH_QUEUE_CONCURRENT第一个是创建串行队列,第二个是创建并行队列。


    dispatch_async

    为了避免界面在处理时操作卡死,在还有一个线程中运行网络请求等操作,我们能够用dispatch_async来放入另外一个队列中。运行,主线程继续运行UI操作;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        // 运行比較耗时的操作
        dispatch_async(dispatch_get_main_queue(), ^{  
            // 更新界面  
        });  
    });


    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
    用来获取一个全局队列,第一个參数是上面4个全局队列中的一个。第二个參数不知道是什么意思,默认填写0即可了。

    上面将块中得 操作放入获取到的全局队列中去运行,运行完毕再获取主队列来更新ui;

    dispatch_group_async

    能够监听一组任务是否完毕,完毕后发送一个通知。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  //取得一个全局并发队列
    dispatch_group_t group = dispatch_group_create();  //创建一个运任务组
    dispatch_group_async(group, queue, ^{  
        [NSThread sleepForTimeInterval:1];  //延迟一秒钟
        NSLog(@"group1");  
    }); 
    //向组中加入任务
    dispatch_group_async(group, queue, ^{  
        [NSThread sleepForTimeInterval:2];  //延迟两秒钟
        NSLog(@"group2");  
    });  <pre name="code" class="objc" style="color: rgb(120, 73, 42); font-size: 11px;">//向组中加入任务
    dispatch_group_async(group, queue, ^{ [NSThread sleepForTimeInterval:3]; //延迟三秒钟 NSLog(@"group3"); });
    //向组中加入任务
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"updateUi"); }); //组中全部任务完毕后发出通知dispatch_release(group); 最后取消任务组

    
    

    dispatch_barrier_async

    在一个队列中等到前面的任务结束后才运行,在运行此任务时保持串行(也就是运行完此任务的全部内容后其它恢复原队列的运行状态);

    dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT);  
    dispatch_async(queue, ^{  
        [NSThread sleepForTimeInterval:2];  
        NSLog(@"dispatch_async1");  
    });  
    dispatch_async(queue, ^{  
        [NSThread sleepForTimeInterval:4];  
        NSLog(@"dispatch_async2");  
    });  
    //以下是锁
    dispatch_barrier_async(queue, ^{  
        NSLog(@"dispatch_barrier_async");  
        [NSThread sleepForTimeInterval:4];  
      
    });  
    dispatch_async(queue, ^{  
        [NSThread sleepForTimeInterval:1];  
        NSLog(@"dispatch_async3");  
    }); 
















  • 相关阅读:
    asp结合swf外调代码
    loadMovie与loadMovieNum区别
    行业常用名词及缩写定义
    用javascript 控制跳转页面
    jdk源码整数和字符串间的转换
    动态代理动态生成java文件并编译成class文件
    JDK源码分析——动态代理源码(Proxy类)
    策略模式与工厂模式比较
    Java编程:常见问题汇总
    工厂方法与抽象工厂的区别
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7145225.html
Copyright © 2011-2022 走看看