Dispatch Queues
简述
Dispatch Queues
是基于 C 语言的,执行自定义工作的技术,从字面意思了解其实就是执行工作的队列,应用 GCD
执行的工作都是放在这个队列中执行的,当然队列的数量能够有多个,类型也不止一种。一个 Dispatch queue
能够串行的执行工作,也能够并行的执行工作,但不论哪种执行工作的形式,都遵循先进先出的准则。串行队列一次只能执行一个工作,当前任务执行完后能力执行下一个工作,并且执行工作的程序和增加工作的程序是统一的。并行队列天然是可同时执行多个工作,不须要期待上个工作实现后才执行下个工作。咱们来看看 Dispatch queue
还有哪些好的个性:
有简略宜用,通俗易懂的编程接口。
提供了主动治理的线程池。
可主动调节队列装载工作的速度。
更优的内存使用率。
使用户不必放心死锁的问题。
提供了比线程锁更优的同步机制。
应用 Dispatch Queue
时,须要将工作封装为一个函数或者一个 block
,block
是Objective-C
中对闭包的实现,在 OS X 10.6
和iOS
4.0 时引入的,在 Swift
中间接为闭包
Dispatch Sources
简述
Dispatch Source
是 GCD
中的一个根本类型,从字面意思可称为调度源,它的作用是当有一些特定的较底层的零碎事件产生时,调度源会捕捉到这些事件,而后能够做其余的逻辑解决,调度源有多种类型,别离监听对应类型的零碎事件。咱们来看看它都有哪些类型:
Timer Dispatch Source
:定时调度源。
Signal Dispatch Source
:监听 UNIX 信号调度源,比方监听代表挂起指令的 SIGSTOP 信号。
Descriptor Dispatch Source
:监听文件相干操作和 Socket 相干操作的调度源。
Process Dispatch Source
:监听过程相干状态的调度源。
Mach port Dispatch Source
:监听 Mach 相干事件的调度源。
Custom Dispatch Source
:监听自定义事件的调度源。
Dispatch Source
是 GCD
中很有意思也很有用的一个个性,依据不同类型的调度源,咱们能够监听较为底层的零碎行为,不管在实现性能方面还是调试性能方面都十分游有用,后文中会再具体讲述。
Operation Queues
简述
Operation Queue
与 Dispatch Queue
很相似,都是有工作队列或操作队列的概念,只不过它是由 Cocoa
框架中的 NSOperationQueue
类实现的,它俩最次要的区别是工作的执行程序,在 Dispatch Queue
中,工作永远都是遵循先进先出的准则,而 Operation Queue
退出了其余的工作执行程序个性,使下一个工作的开始不再取决于上个工作是否已实现。
应用 Dispatch Queue
时,须要将工作封装为一个函数或者闭包。而在 Operation Queue
中,须要将工作封装为一个 NSOpertaion
对象,而后放入操作队列执行。同时该对象还自带键值察看(KVO)告诉个性,能够很不便的监听工作的执行过程。
设计并发工作时应该留神的事项
尽管并发执行工作能够进步程序对用户操作的响应速度,最大化应用内核,晋升利用的效率,然而这些都是建设在正确正当应用并发工作技术,以及应用程序的确须要应用这类技术的前提下。如果应用不得当,或者对简略的应用程序画龙点睛,那么反而会因为应用了并发工作技术而导致应用程序性能降落,另一方面开发人员面对的代码复杂度也会减少,保护老本同样会回升。所以在筹备应用这类技术前肯定要三思而行,从性能、开发成本、保护老本等多个方面去思考是否须要应用并发工作技术。
思考是否须要用只是第一步,当确定应用后更不能自觉的就开始开发,因为并发工作技术的应用须要侵入应用程序的整个开发生命周期,所以在利用开发之初,就是思考如何依据这类技术去设计并发工作,思考利用中工作的类型、工作中应用的数据结构等等,否则亡羊补牢也为时已晚。这一节次要说说在设计并发工作时应该留神哪些事。
1. 梳理应用程序中的工作
在入手写代码前,尽量依据需要,穷举利用中的工作以及在工作中波及到的对象何数据结构,而后剖析这些工作的优先级和触发类型,比方列举出哪些工作是由用户操作触发的,哪些是工作是无需用户参加触发的。
当把工作依据优先级梳理好后,就能够从高优先级的工作开始一一剖析,思考工作在执行过程中波及到哪些对象和数据结构,是否会批改变量,被批改的变量是否会对其余变量产生影响,以及工作的执行后果对整个程序产生什么影响等。举个简略的例子,如果一个工作中对某个变量进行了批改,并且这个变量不会对其余变量产生影响,而且工作的执行后果也绝对比拟独立,那么像这种工作就最合适让它异步去执行。
2. 进一步细分工作中的执行单元
工作能够是一个办法,也能够是一个办法中的一段逻辑,不论是一个办法还是一段逻辑,咱们都能够从中拆分出若干个执行单元,而后进一步剖析这些执行单元,如果多个执行单元必须得依照特定得程序执行,而且这一组执行单元的执行后果想对独立,那么能够将这若干执行单元视为执行单元组,能够思考让该执行单元组异步执行,其余不须要依照特定程序的执行单元能够别离让它们异步执行。能够应用的技术能够用 GCD 或者 Operation Queue。
在拆分执行单元时,尽量拆的细一点,不要放心执行单元的数量过多,因为 GCD 和 Operation Queue 有着高性能的线程管理机制,不须要放心过多的应用工作队列会造成性能损耗。
3. 确定适合的队列
当咱们将工作合成为一个个执行单元并剖析之后,下一步就是将这些执行单元封装在 block 中或者封装为 NSOperation 对象来应用 GCD 或 Operation Queues,但在这之前还须要咱们依据执行单元确定好适宜的队列,不论是 Dispatch queue 还是 Operation queue,都须要明确是应用串行队列还是并行队列,确定是将多个执行单元放入一个队列中还是别离放入多个队列中,以及应用正确优先级的队列。