你的名字:GCD

作者: 市民张某 | 来源:发表于2016-12-07 19:31 被阅读214次

简介

   GCD全称是Grand Central Dispatch,翻译为中枢调度器,是苹果开发的一个多核并行运算的解决方案。GCD旨在代替诸如NSThread、NSOperation等技术,它结合block可以更加方便的进行多线程开发。

任务和队列

1.任务
 
任务指的是你要执行的操作。
2.队列(串行队列和并行队列)
    串行队列意味着不能开辟新线程,只能将队列中的任务放到主线程中,每次也只能执行一个任务。并行队列则相反,可以开辟新线程,一次可以执行多个任务,不必等到执行的任务完成才执行下一个。

网上找的图.jpg

基本操作

   1.创建队列
       
dispatch_queue_create方法第一个参数是为自定义队列的名称;第二个参数是设置自定义队列为串行还是并行。DISPATCH_QUEUE_SERIAL/NULL为串行队列,DISPATCH_QUEUE_CONCURRENT为并行队列。

自定义队列.jpg

   系统也提供了另外两种创建好的队列:全局队列和主队列。
   全局队列属于并行队列,全局可见;第一个参数为设置队列优先级;第二个参数暂无意义。

全局队列.jpg 全局队列第一个参数.jpg

主队列属于串行队列,运行在主线程中。

主队列.jpg


   2.执行任务

       1)常用的执行方式有两种:同步执行(sync)和异步执行(async)。同步执行不具备开启新线程的能力,而异步执行则相反。第一个参数指的是任务的队列,第二个参数就是任务。

执行任务.jpg


组合.jpg

          常用的用法:

常用用法.jpg

       2)dispatch_apply:该函数按指定的次数将block任务添加到指定的队列中。

dispatch_apply.jpg

            该函数可用于循环调用block任务,串行并行取决于加到哪个队列中。

循环调用.jpg

        3)dispatch_barrier_async和dispatch_barrier_async:该函数需要等到函数前面的操作执行完才能够执行,且得等到函数执行完毕后函数后面的操作才能执行。

barrierjpg

       3)dispatch_after:该函数让我们延时将block加入到队列中,而不是延时执行block任务。第一个参数为延迟的时间;第二个为指定队列,第三个为block任务。

after.jpg

              创建dispatch_time _t的函数dispatch_time有两个参数。第一个为时间模式,时间模式分为两种:相对时间(DISPATCH_TIME_NOW)和绝对时间(DISPATCH_TIME_FOREVER);第二个为延迟的时间值,系统也提供了常量供我们使用:NSEC_PER_SEC(每秒多少纳秒)、NSEC_PER_MSEC(每毫秒多少纳秒)、USEC_PER_SEC(每秒多少微秒)、NSEC_PER_USEC(每微妙多少纳秒)

  3.dispatch group
        用于将多个block任务归为一组,以检测这些任务全部完成或者等待全部完成时发出的消息。有几个函数需要注意:dispatch_group_notify函数只有当group里面的所有block任务完成后才会被调用;dispatch_group_wait函数指当group所有任务执行完或者等待指定时间后才会被调用。怎么证明呢,请看下面两张图。(PS : dispatch_group_notify也能通过打印信息验证。)

图1.jpg


图2.jpg

3.dispatch once
       dispatch_once函数仅仅执行一次block任务,仅当onceToken为零时才会执行block任务。任务执行完onceToken的值又改为非零。

dispatch_once.jpg

4.信号量
    信号量是一个整型值并有一个初始数值,支持两个操作:信号通知和信号等待。每调用dispatch_semaphore_wait一次,其计数为减一;每调用一次dispatch_semaphore_signal,计数为加一。当计数小于零时,dispatch_semaphore_wait后面的操作无法执行,线程被阻塞。

信号量.jpg

   5.dispatch source
        它用于检测系统底层某些特定类型的事件,只有当特定类型发生时才会将block任务放到队列中。详细请浏览:http://songzengbin.github.io/blog/2013/08/15/dispatchzhi-yan-jiu-xue-xi/
    6.dispatch_suspenddispatch_resume
         dispatch_suspend,dispatch_resume分别对应的是队列的挂起和恢复。当挂起时有block正在执行的话是需要等到当前block任务执行完后队列才能被挂起。

挂起和恢复.jpg

相关文章

  • 你的名字:GCD

    简介 GCD全称是Grand Central Dispatch,翻译为中枢调度器,是苹果开发的一个多核并行运算的...

  • iOS面试题-GCD

    一、在GCD中常见的名次解释:名词解释 GCD:全称是Grand Central Dispatch,中文名字大脑中...

  • 【译】用GCD保证线性操作(Keeping Things Str

    这是GCD介绍的第六篇文章,也是最后一篇。 有经验的GCD使用者会告诉你:使用GCD时,你很容易就会忘记你当前在哪...

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • iOS 多线程GCD简介

    GCD :(Grand Central Dispatch )听名字就很霸气。是Apple开发的一个多核编程的解决方...

  • gcd

    GCD 异步请求,我只认准 GCD | GCD异步,你值得拥有 (广告先走一波) 网络请求放在子线程,UI 只能在...

  • 扩展GCD(求逆元,解同余方程等等)

    首先要知道gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(|a|,|b|)=gcd(b,a%b)...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • Grand Central Dispatch 小记

    概述 GCD 是 iOS中一个非常重要的内容,关系到线程的分配和管理。 GCD 的一些概念 要了解GCD,你需要先...

网友评论

    本文标题:你的名字:GCD

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