• GCD的简单介绍


    一)GCD 的使用方式

    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    async表明运行方式

    queue则是你把任务交给那个线程队列来处理

    block代表的是你要做的事情

    //线程运行方式 

    dispatch_async 异步执行

    dispatch_sync  同步执行

    dispatch_delay 延迟执行

    ...

    二)处理任务对象 dispatch queue(线程队列) 

    一、dispatch_get_main_queue  主线程队列(UI线程队列)

    二、dispatch_get_global_queue 并行线程队列,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。

    三、串行队列,一般用于按顺序同步访问,依次执行(顺序由代码先后觉得),可创建任意数量的串行队列,各个串行队列之间是并发的。

    当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。

    串行队列通过dispatch_queue_create创建,可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。

    //dispatch queue叫线程队列

    dispatch_queue_create 用于创建用户线程队列。可以创建Serial/Concurrent Dispatch Queue 两种队列,即串行与并行队列。

    一、创建Serial Dispatch Queue。 

    dispatch_queue_t serialQueue =  dispatch_queue_create (  "com.SerialQueue" , NULL ); 

    可以创建多个串行队列,串行队列也可以并行执行。决不能随意的大量生产Serial Dispatch Queue。 

    二、创建Concurrent Dispatch Queue 

    dispatch_queue_t concurrentQueue =  dispatch_queue_create ( "com.ConcurrentQueue" , 

    DISPATCH_QUEUE_CONCURRENT ); 

    Concurrent Dispatch Queue不过创建多少都没有问题,因为Concurrent Dispatch Queue所使用的线程由系统的XNU内核高效管理,不会影响系统性能。 

    三) 只执行一次的线程  一般用来写单例模式

    static dispatch_once_t onceToken; 

    dispatch_once (&onceToken, ^{ 

    });

    EG:

    SubObject *subobject =  nil ; 

    + (  SubObject *)sharedRequest 

    static dispatch_once_t onceToken; 

    dispatch_once (&onceToken, ^{ 

    subobject = [[  SubObject alloc ]  init ]; 

    return subobject 

    // 延迟2秒执行线程

    double delayInSeconds =  2.0 ; 

    dispatch_time_t popTime =  dispatch_time (  DISPATCH_TIME_NOW , delayInSeconds *  NSEC_PER_SEC ); 

    dispatch_after (popTime, dispatch_get_main_queue  (), ^( void ){

    // code to be executed on the main queue after delay 

    });

    //线程汇总通知,等所有子线程(这个称呼不准确,先代替了)执行完成后,才执行notify线程

    dispatch_group_t group = dispatch_group_create  ();

    dispatch_group_async  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

    // 并行执行的线程一 

    for (  int i=  0 ; i<  10 ; i++) { 

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

    }

    });

    dispatch_group_async  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

    // 并行执行的线程二 

    for (  int i=  10 ; i<  20 ; i++) { 

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

    }

    });

    dispatch_group_notify  (group, dispatch_get_global_queue  ( 0 , 0 ), ^{

    // 汇总结果

    NSLog (  @"完成" ); 

    });

  • 相关阅读:
    hg下拉和上传代码
    PC下ubuntu查找PC串口并加入用户组
    pyserial安装
    profile, bashrc, source, setup.*sh
    另一篇xtion、kinect选择比较(openni下)
    OpenCV、PCL;Xtion、kinect;OpenNI、kinect for windows SDK比较
    ROS安装环境配置及多版本的切换
    ubuntu安装软件或upgrade出现 You might want to run 'apt-get -f install' to correct these
    树莓派静态IP配置
    android之MP3播放器(1)
  • 原文地址:https://www.cnblogs.com/changeUniversal/p/4645085.html
Copyright © 2020-2023  润新知