IOS-GCD的一点认识

来源:互联网 发布:鼠标宏设置软件 编辑:程序博客网 时间:2024/05/16 14:00

Serial Dispatch Queue  串行调度队列 等待现在执行中处理结束  

Concurrent Dispatch Queue  并行调度队列 不等待现在执行中处理结束


Main Dispatch Queue 在主线程中执行,也就是Serial Dispatch Queue 跟 NSObject类的performSelectorOnMainThread实例方法这一执行方法相同


Global Dispatch Queue 是所有应用程序都能够使用的Concurrent Dispatch Queue 。没必要通过dispatch_queue_create函数逐个生成Concurrent Dispatch Queue,只要获取Global Dispatch Queue使用即可


Global Dispatch Queue 有4个优先级,高优先级 High Priority, 默认优先级 Default Priority, 低优先级 Low Prioity 后台优先级 Background Priority.


dispatch_queue_create 函数生成的Dispatch Queue 不管是Serial Dispatch Queue还是 Concurrent Dispatch Queue ,都与默认优先级Global Dispatch Queue 相同执行优先级的线程。而变更生成的Dispatch Queue的执行优先级要使用 dispatch_set_target_queue函数.


dispatch_barrier_async 函数会等待追加到Concurrent Dispatch Queue 上的并行执行的处理全部介绍之后,再将指定的处理追加到该Concurrent Dispatch Queue 种,然后在由dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue 才恢复为一搬的动作,追加到该Concurrent Dispatch Queue 的处理又开始并行执行,


dispatch_async 函数的async意味着非同步(asynchronous),就是将指定的Block 非同步的追加到指定的Dispatch Queue中,dispatch_async不做任何等待


dispatch_sync,sync意味着同步(synchronous),也就是将指定的Block “同步”追加到指定的Dispatch Queue中。在追加的Block结束之前,dispatch_sync函数会一直等待.


dispatch_apply函数是dispatch_sync函数和dispatch Group的关联API,该函数按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束


当追加大量处理到Dispatch Queue时,在追加处理的过程中,有时希望不执行已追加的处理,例如演算结果被Block劫获时,一些处理会对这个演算结果造成影响。在这种情况下,只要挂起Dispatch Queue即可。当可以执行时再恢复

dispatch_suspend 挂起指定的Dispatch Queue

 dispatch_resume 恢复指定的Dispatch Queue

这些函数对已经执行的处理没有影响。挂起后,追加到Dispatch Queue中但尚未执行的处理在此之后停止执行。而恢复则使得这些处理能够继续执行


Dispatahc Semaphore 是持有计数的信号,该计数是多线程编程中的计数类型信号.计数为0时等待,计数为1孩子大于1时,减去1而不等待.在没有Serial Dispatch Queue和dispatch_barrier_async函数那么大粒度且一部分处理需要进行排他控制的情况下,Dispatch Semaphore便可发挥威力.


Dispatch I/O 和 Dispatch Data 可以把文件分成合适的大小并使用Global Dispatch Queue并列读取

Dispatch Data 可以把数据进行简单的结合和分割


Global Dispatch Queue 有如下8种

High Priority,Defaulty Priority,Low Priority,Background Priiority,High Overcommit priority,Default Overcommit Priority,Low Overcommit Priority,Background Overcommit priority



Dispatch Queue

用于管理追加的BLOCK的C语言层实现的FIFO队列

Atomic 函数中实现的用于排他控制的轻量级信号

用于管理线程的C语言层的实现的一些容器


Dispatch Source

BSD系内核惯有功能kqueue的包装


dispatch source 负责监听事件

dispatch_source_create(dispatch_source_type_t type, uintptr_t handle, unsigned long mask, dispatch_queue_t queue)

第1个参数:要监听的事件类型 第2个参数:可以理解为句柄、索引或id,假如要监听进程,需要传入进程的ID 第3个参数:根据参数2,可以理解为描述,提供更详细的描述,让它知道具体要监听什么 第4个参数:当事件发生时,将block添加至哪个队列来执行

可监听事件的类型
 DISPATCH_SOURCE_TYPE_TIMER        定时响应,在网络编程的通信超时等情况下可使用该例
 DISPATCH_SOURCE_TYPE_SIGNAL      接收到UNIX信号时响应
 DISPATCH_SOURCE_TYPE_READ   IO操作,如对文件的操作、socket操作的读响应
 DISPATCH_SOURCE_TYPE_WRITE     IO操作,如对文件的操作、socket操作的写响应   
 DISPATCH_SOURCE_TYPE_VNODE    文件状态监听,文件被删除、移动、重命名
 DISPATCH_SOURCE_TYPE_PROC  进程监听,如进程的退出、创建一个或更多的子线程、进程收到UNIX信号
 DISPATCH_SOURCE_TYPE_MACH_SEND
 DISPATCH_SOURCE_TYPE_MACH_RECV   上面2个都属于Mach相关事件响应
 DISPATCH_SOURCE_TYPE_DATA_ADD
 DISPATCH_SOURCE_TYPE_DATA_OR          上面2个都属于自定义的事件,并且也是有自己来触发

0 0
原创粉丝点击