ios - GCD (1)

作者: 小桃桃 | 来源:发表于2015-01-19 22:28 被阅读268次

    1.什么是GCD?

    GCD (Grand Central Dispatch) 是异步执行任务的技术之一,以非常简洁的语法实现了复杂繁琐的多线程编程。

    使用GCD的语法如下:

    dispatch_async(queue, ^{

      //在后台 执行耗时的操作处理,处理完毕后调用主线程更新用户界面

      dispatch_async(dispatch_get_main_queue(), ^{

          //主线程同步,例如更新用户界面

       });

    });


    2.Dispatch_Queue

    GCD中有2种类型队列,Serial Dispatch Queue 和 ConcurrentDispatch Queue。

    1) Serial Dispatch Queue

    串行队列,按照任务顺序执行处理,在同一时间执行一个任务,如下图:

    串行队列工作模式

    Serial Dispatch Queue 不使用锁,可以解决多线程中 “数据竞争”的问题,如下图:

    数据竞争问题

    iOS 中的UI主线程队列 是Serial Dispatch Queue 类型,创建一个Serial Dispatch Queue时,系统会为此队列创建一个线程,比如创建5个Serial Dispatch Queue此时系统就会创建5个线程,过多的创建会消耗大量内存,引起大量上下文切换,大幅降低系统相应性能。

    2) Concurrent Dispatch Queue

    并行队列,队列中执行的任务顺序是不固定的,如下图:

    并行队列工作模式

    Concurrent Disaptch Queue 使用XNU内核来管理线程,不会发生Serial Dispatch Queue的问题。如果操作中不存在"数据竞争" 问题,请使用Concurrent Dispatch Queue。

    3.创建队列

    1) 使用dispatch_queue_create

    创建Serial Dispatch Queue

    dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("queue identity", nil);

    创建Concurrent Dispatch Queue

    dispatch_queue_t myConcurrentDispatchQueue = dispatch_queue_create("queue identity", DISPATCH_QUEUE_CONCURRENT);

    参数1 :队列的标示(建议identity定义的规范,在输出错误日志调试时非常有用)

    参数2: 队列类型,nil 代表 Serial 队列 , DISPATCH_QUEUE_CONCURRENT代表 Concurrent 队列

    *具体信息可查阅苹果官方的帮助文档

    2) 使用系统标准提供的 Dispatch Queue 来创建

    dispatch_get_global_queue()

    dispatch_get_main_queue()

    相关文章

      网友评论

        本文标题:ios - GCD (1)

        本文链接:https://www.haomeiwen.com/subject/akqhxttx.html