GCD多线程化繁入简

2016-09-06  本文已影响61人  雷晏

gcd想必大家并不陌生,知道是用来多线程的,却不知道怎么去使用。接下来,我将带领大家去一步步从零研究gcd,认识gcd,去使用gcd。

为什么要去使用gcd呢。是为了让耗时的操作分开一个子线程让其去处理,等处理完毕后再把结果返回到主线程,这样就不会使得主线程阻塞,大大增加应用友好度,用户体验。

在gcd中有一个重要的概念-队列(queue),不管是开辟主线程,还是子线程,都是一个队列,线程操作都是在队列中操作的。(个人对此的理解)

在了解gcd框架之前我们要先了解下如何去得到一个子线程队列、主线程队列。

补充:如何去开辟一个同步线程,异步线程

gcd中包括几大知识模块:

串行队列

并发队列

延时线程

线程组

定时器

信号量

串行队列

顾名思义,就是依次执行。

通过dispatch_queue_create来创建一个串行队列

输出结果:

并发队列

顾名思义,就是一起执行,没有顺序。

输出结果:

延时线程

在gcd中的延时操作相比于基于Thread的performSelector的精确度上没那么高。

输出结果:

线程组

定义上讲,就是将线程放倒一个组,可以用来监听线程执行顺序。

比如:这里有3个线程(线程1,线程2,线程3)。我想要在线程1、线程2执行完毕后再去执行线程3 。(前提:在并发队列中),就可以将3个线程放在线程组里去管理监听。

dispatch_group_notify就是拿来监听线程组的执行,当执行完毕才会去执行线程3.

输出结果:

定时器

gcd定时器精确度上不高,会有0.几的误差。

输出结果:

输出结果:

信号量

dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。

简单地概括:在多个子线程中,想要你固执控制这些子线程的操作顺序,可以通过信号量这个来处理。

比如:这里有2个子线程(并发队列),我想要线程1执行完毕后才让线程2去执行,就可以通过信号量在线程1执行完毕的时候发出一个信号,在线程2中通过信号量阻塞线程2,只有当接受到线程1发出的信号才执行。

输出结果:

补充:通过dispatch_once,实现闭包中的代码只执行一次.

gcd封装框架demo github

总结:合理运用gcd的知识,可以使得你的程序更加流畅。

上一篇下一篇

猜你喜欢

热点阅读