GCD学习

原创 2016年05月30日 09:51:58

Grand Central Dispatch--GCD


GCD是苹果对多核的并行运行一种解决方案。(iOS中实现多线程目前有4种方案,最常用的是GCDNSOperation两种)

优点:基于C语言,简单易用,效率高,速度快,会自动管理线程生命周期,开发者只需关心GCD要执行的任务和队列

缺点: GCD的场景复杂时,可能会遇到死锁

博主只用过NSThread和GCD,觉得GCD用着挺方便的,加之听闻其效率高,感觉高大上,故也掺和掺和。其实我对GCD的理解也不深,只是列出我理解的东西,至少会用就好。

队列类型  queueType
1⃣️main_queue --主队列 (串行队列)
2⃣️Global_Dispatch_Queue  -- 全局调度队列 (并发队列)
tips:这里解释下串行跟并发,串行是指同一时间只有一个任务被执行,前面的任务没完成,后面的只能等待⌛️;并发队列是指同一时间可以有多个任务被执行,而且能得到的保证是它们会按照被添加的顺序开始执行,但何时开始,某一时刻有多少个任务执行,都是不确定的,只取决于GCD。
上面说到,有主队列和全局调度队列两种,全局调度队列又分为四个不同的优先级(backgroud、low、default、high),故系统中一般至少有五个队列。为何说至少,因为你也可以创建你自己的队列,这样就有不只五个队列了。

同步与异步
同步异步是相对于函数说的,一个同步函数只在它完成了任务才会返回,异步函数在开始了一个Block后立即返回,不管Block任务有没有完成。
dispatch_sync (...^{  } );   同步执行
dispatch_async (...^{  } );   异步执行
=>dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH,0),^{  ...  } );



下面列出一些实用的知识
Dispatch_barriers   阻塞
让一个并发队列变成串行队列,确保使用barrier提交的Block是队列中惟一执行的条目。

Dispatch_groups  调度组
在调度组里的所有任务都完成时,可同步/异步通知你。
 用法   1⃣️dispatch_group_t  myGroups = dispatch_group_create( );
    2⃣️dispatch_group_enter(myGroups);    //通知myGroups任务开始
. . .(这里写任务)
. . .
    3⃣️dispatch_group_leave(myGroups);    //通知myGroups任务完成
  //同步通知,会阻塞当前线程,直到所有任务完成
    4⃣️dispatch_group_wait(myGroups,DISPATCH_Time_forever);
       //myGroups没有任务时,会异步执行Block的代码
   或异步4⃣️dispatch_group_notify(myGroups,dispatch_get_main_queue( ),^{... });

后记,觉得这个GCD还是挺难的,在没有熟悉GCD的情况下,请不要乱用复杂的命令于项目中。


参考:
       nixzhu/dev-blog翻译作品
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

GCD线程基础学习资源

  • 2016年08月09日 11:03
  • 41KB
  • 下载

iOS-多线程编程学习之GCD——串行队列和并发队列(五)

Grand Central Dispatch(GCD)有很多部分构成,例如有很好的语言特性,运行库,还提供了系统的、高效的方式来支持具有多核处理器的iOS和OS X设备进行并发事件处理。   BSD...

GCD 学习总结

一些相关的名词。 串行和并行用于描述队列。串行队列总是一个任务一个任务的执行,并行队列可能同时执行多个任务。 同步和异步对函数调用来讲。同步调用会等到调用的方法执行完成再返回控制权,异步调用是通知函数...

iOS系统GCD学习(2):Dispatch Queue

GCD的基本概念就是dispatch queue。dispatch queue是一个对象,它可以接受任务,并将任务以先到先执行的顺序来执行。dispatch queue可以是并发的或串行的。并发任务...

GCD学习之dispatch_after

dispatch_after 经常会有这样的情况:想要在3秒后执行处理。这种想在指定直接后执行处理的情况,可使用dispatch_after函数。 在3秒后将指定的Block追加到Ma...
  • yxys01
  • yxys01
  • 2016年06月03日 10:46
  • 444

iOS-GCD的学习记录(1)

GCD的学习记录,总结给自己 Dispatch Queue,如名所示,它是一个队列,用于存储要执行的任务。程序员可以用block语法编写要执行的任务,再通过dispatch_async函数将它加入...

iOS多线程学习---GCD

iOS多线程学习---GCD

iOS学习之GCD 信号量详解,dispatch_semaphore、NSOperationQueue

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,...

IOS学习之GCD的使用

转自http://blog.csdn.net/zhangao0086/article/details/38904923坚持 成长 每日一篇Grand Central Dispatch(GCD)是异步执...

iOS GCD 学习

iOS开发中,多线程应用方式一般有如下几种 1 比较高层的,封装好的API:NSThread。用来创建非常驻线程以及常驻线程,默认支持NSRunLoop机制。 2 比较高层的,封装好的API:NS...
  • CSUCFL
  • CSUCFL
  • 2015年12月11日 16:34
  • 524
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCD学习
举报原因:
原因补充:

(最多只允许输入30个字)