iOS多线程GCD的使用

1.什么是GCD
GCD是Grand Central Dispatch的缩写,是苹果公司开发的一种基于block的并行操作机制。它由两部分组成,一是FIFO队列,二个是线程池,队列添加任务,线程池执行任务。其中FIFO队列称为dispatch queue,这保证了先进来的任务先得到执行,但不保证先结束。
dispatch queue分为下面两种:
第一种,Serial Dispatch Queue,线程池只提供一个线程,所以后一个线程必须等到前一个前程执行结束才能开始,顺序执行。
第二种,Concurrent Dispatch Queue,线程池提供多个线程,所以可以按照顺序启动多个线程,并发执行。

2.基本使用
队列通过dispatch_queue_create来创建,看代码:

系统默认就有一个串行队列main_queue和并行队列global_queue,你可以这么获取:

从网络抓取数据,然后更新UI,我们经常这么做:

dispatch_async接口是用来提交block给指定queue进行异步执行,如果成功提交,那么立刻返回,程序继续往下执行。注意,block是定义在stack上的,需要复制到pile上,再执行。与之对应的是dispatch_sync接口,提交block提供同步执行。这个接口会等到block执行结束以后才返回,在主线程这样做是没意义的,主要在子线程上使用。有一种写法会有死锁,要注意:

3.普通控制
dispatch_once:这个接口可以保证在整个应用程序生命周期中某段代码只被执行一次,详见我的iOS单例模式(Singleton)那篇文章。
dispatch_after:让线程等个两秒钟然后给个提示

dispatch_set_target_queue:可以设置一个dispatch queue的优先级,或者指定一个dispatch source相应的事件处理提交到那个queue上。注意,只是开始的顺序,如果前面没有按顺序来,这里dispatch_set_target_queue(serialQ,mainQ),让serialQ与主线程的级别一样高。第二个参数是参照物,让第一个线程和参照线程的优先级一样。
dispatch_apply:执行某段代码若干次。这样做的另一个好处是,处理NSArray中元素的Block并行执行,速度更快

dispatch group:该机制允许我们监听一组任务是否完成

或者说同步地等待一段时间看是否结束:

dispatch_barrier_async:提交的任务会等它前面的任务执行结束才开始,然后它后面的任务必须等它执行完毕才能开始。

注意:如果使用globalQ会先执行dispatch_barrier_async的任务。



发表评论

电子邮件地址不会被公开。 必填项已用*标注