iOS - GCD 深入理解

如需转载,请注明出处,尊重他人劳动,谢谢

GCD:Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。是用C实现的,用起来很方便,而且很强大。

下面就来介绍GCD把。

1: 同步 和 异步 方法

1.1 同步  dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)

第一个参数:传入一个队列,会吧block 任务加入到队列

第二个block: 是需要执行的任务代码

同步方法 没有创建线程的能力;

1.2 异步 dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)

参数跟同步方法一样。但是异步方法有创建新线程的能力!!

2: 队列

2.1 串行队列

第一个参数: 是个C 的 参数,就一个C类型的字符串

第二个参数:创建什么类型的队列。DISPATCH_QUEUE_SERIAL 为串行

dispatch_queue_t quue =  dispatch_queue_create("com.joyfun.yg", DISPATCH_QUEUE_SERIAL);

2.2 并发队列

参数跟上面一样。DISPATCH_QUEUE_CONCURRENT 为并发队列

dispatch_queue_t quue =  dispatch_queue_create("com.joyfun.yg", DISPATCH_QUEUE_CONCURRENT);

也可用下面的方法

第一个第二个参数 给定 0,0  就行了,不要管它

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

好了。2中方法2中队列,那么有4种组合方式

3. 代码。(不喜欢废话,代码先撸为敬)

3.1 异步+ 并发

看一下输出结果吧:

看到了吧。number 是变动的,2、3、4, 说明创建了线程哦,线程的创建个数,由系统决定,看 a.b.c 是说明它是并发的哦,不是按照循序执行的。

3.2 异步+ 串行

运行起来:

注意到 number = 2  ,创建了新线程了,再看a.b.c,是按照添加的循序执行的,说明是串行的哦。

3.3 同步+并发

number =1 ,name=main, 是主线程啦。说明同步方法没有能力创建线程,a、b、c是按照循序执行的,说明 并发 只能在异步方法里面有效。

3.4 同步+ 串行

呀买碟。结果跟上面一样。记住啦。

4. GCD延时

之前咱们调用延时方法老是用这个

[self performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#>]

是不是很low,来点高大上的GCD.

第一个参数: 从什么时候开始,默认的现在开始,不要管它

第二个参数: 延时多久,给它个时间,秒

第三个参数:在哪个队列中执行。默认主队列,可以根据你的需要修改

第四个: 任务,写你需要做的事情

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

<#code to be executed after a specified delay#>

});

GCD延时


效果跟以前的performSelector 一样吧。用起来

5. GCD Timer

以前用定时器喜欢用 NSTimer 去创建一个 定时器,那么现在可以用 GCD 定时器,精准度很高。还有个很大的优点 : GCD定时器不受RunLoop约束,比NSTimer更加准时。

GCD timer

就这么强大,简单。

6. GCD 一次性函数

应用场景: 单例。 表示只创建一次,不多说,很简单

就写到这儿,有时间再去跟新其它GCD几个函数.谢谢大家的阅读,共同提高能力!欢迎老司机指点

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容