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的情况下,请不要乱用复杂的命令于项目中。


参考:
版权声明:本文为博主原创文章,未经博主允许不得转载。

ios☞GCD学习资料

iphone ios 如何使用gcd,block http://blog.sina.com.cn/s/blog_45e2b66c01010dhd.html 1。GCD之dispatch queue...
  • wwwang89123
  • wwwang89123
  • 2013年07月11日 17:15
  • 811

如何在iOS中使用Block──How to use Blocks with iOS

Block可以帮助我们组织独立的代码段,并提高复用性和可读性。iOS4在UIKit中引入了该特征。超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识。 Blo...
  • wwwang89123
  • wwwang89123
  • 2013年08月03日 00:20
  • 518

GCD算法

网上代码多的是,我只是记下来而已 基础 int gcd(int a,int b) { int r; while(b>0) { r=a%b; ...
  • Niteip
  • Niteip
  • 2014年02月19日 10:17
  • 6714

gcd(a,b)=1的含义及用法

历史上第一个称得上算法的好像就是这个欧几里得算法,其实就是地球人都知道的辗转相除,不要小看她,她是很美的。   简单的描述就是,记gcd(a,b)表示非负整数a,b的最大公因数,那么:gcd(a,...
  • sunstars2009918
  • sunstars2009918
  • 2012年01月10日 10:30
  • 3284

扩展GCD算法学习笔记

首先对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。求解 x,y的方法...
  • xieguofu2014
  • xieguofu2014
  • 2015年10月28日 20:37
  • 1014

最大公约数GCD的三种算法程序

这里给出使用欧几里得算法求最大公约数的递归和非递归的程序,同时给出穷举法求最大公约数的程序。 从计算时间上看,递推法计算速度最快。 程序中包含条件编译语句用于统计分析计算复杂度。 /* * 计算两个...
  • tigerisland45
  • tigerisland45
  • 2016年04月14日 14:57
  • 7921

GCD的简单应用--异步加载图片

在这里,简单介绍下GCD的应用。 1.编程场景 :     在iPhone上做一个下载图片的功能,很简单,就是在屏幕上放置一个按钮,点击该按钮,显示一个转动的圆圈,表示正在下载,下载完成后,将图片...
  • qq_34417314
  • qq_34417314
  • 2016年09月06日 14:05
  • 731

求最大公约数gcd算法

求两个正整数a,b最大公约数方法较常用的是欧几里得提出的辗转相除法 假设a=b*k+r …….(1),则gcd(a,b)=gcd(b,r)…….(2); 证明: 设c=gcd(a,b),则a=c...
  • GaoShan1011
  • GaoShan1011
  • 2016年09月21日 16:57
  • 389

使用GCD在主/子线程中操作

dispatch_async(dispatch_get_main_queue(), ^{     });     dispatch_async(dispatch_get_global_queue(...
  • xyxjn
  • xyxjn
  • 2014年02月13日 16:34
  • 8655

深入探索GCD----关于GCD你不知道的全在这里(二)

迭代执行: 如果你正在倒弄一些数字,并且手头上的问题可以拆分出同样性质的部分,那么 dispatch_apply 会很有用。 如果你的代码看起来是这样的: for (size_t y = 0; y ...
  • youshaoduo
  • youshaoduo
  • 2017年04月24日 15:20
  • 8649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCD学习
举报原因:
原因补充:

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