SDK源码解读系列:《iOS与OSX多线程和内存管理》书摘之GCD内部实现(二)
2013-09-01 21:57
393 查看
Dipatch Source
GCD中除了主要的Dispatch Queue以外,还有不太引人注目的Dispatch Source。它是一种BSD系列内核惯有功能kqueue的封装。
kqueue是在XNU内核中由发生各种事件时,在应用程序层面来处理的技术。其CPU符合非常小,基本上不占用资源。kqueue可以说是应用程序处理XNU内核中的事件处理机制中最为优秀的。
Dispatch Source 可以处理以下事件。如表所示:
Dispatch Source的种类
事件发生时,在指定的Dispatch Queue中可执行事件的处理。
下面我们看看DISPATCH_SOURCE_TYPE_READ方法是怎样来读取一个异步文件描述器的:
GCD中除了主要的Dispatch Queue以外,还有不太引人注目的Dispatch Source。它是一种BSD系列内核惯有功能kqueue的封装。
kqueue是在XNU内核中由发生各种事件时,在应用程序层面来处理的技术。其CPU符合非常小,基本上不占用资源。kqueue可以说是应用程序处理XNU内核中的事件处理机制中最为优秀的。
Dispatch Source 可以处理以下事件。如表所示:
名称 | 内容 |
---|---|
DISPATCH_SOURCE_TYPE_DATA_ADD | 增加变量 |
DISPATCH_SOURCE_TYPE_DATA_OR | 变量OR |
DISPATCH_SOURCE_TYPE_MACH_SEND | 通过MACH端口发送 |
DISPATCH_SOURCE_TYPE_MACH_RECV | 通过MACH端口接收 |
DISPATCH_SOURCE_TYPE_PROC | 检测进程相关事件 |
DISPATCH_SOURCE_TYPE_READ | 文件描述器变为可读 |
DISPATCH_SOURCE_TYPE_SIGNAL | 收到信号 |
DISPATCH_SOURCE_TYPE_TIMER | 定时器 |
DISPATCH_SOURCE_TYPE_VNODE | 文件系统被修改 |
DISPATCH_SOURCE_TYPE_WRITE | 文件描述器其变为可写 |
下面我们看看DISPATCH_SOURCE_TYPE_READ方法是怎样来读取一个异步文件描述器的:
__block size_t total = 0; size_t size = 读取的字节数; char *buff = (char *)malloc(size); /* * 将sockfd设置为异步(NONBLOCK)式的描述器,一个文件描述器*/ fcntl(sockfd, F_SETFL, O_NONBLOCK); /* * 获取用于追加事件处理的Global Dispatch Queue. */ dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); /* * 将READ事件创建为Dispatch Source. */ dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, sockfd, 0, queue); /* * 为READ事件指定任务. */ dispatch_source_set_event_handler(source, ^{ /* * 获取可读取的字节数. */ size_t available = dispatch_source_get_data(source); /* * 从描述器中读取数据 */ int length = read(sockfd, buff, available); /* * 当有错误发生时,取消Dispatch Source. */ if (length < 0) { /* * 错误处理 */ dispatch_source_cancel(source); } total += length; if (total == size) { /* * buff的处理 */ /* * 完成后取消dispatch source */dispatch_source_cancel(source); } }); /* * 为dispatch source的取消事件设置任务 */ dispatch_source_set_cancel_handler(source, ^{ free(buff); close(sockfd); /* * 释放dispatch source自己 */ dispatch_release(source); }); /* * 恢复dispatch source */ dispatch_resume(source);
相关文章推荐
- SDK源码解读系列:《iOS与OSX多线程和内存管理》书摘之GCD内部实现(一)
- GCD内部实现--摘自《iOS与OS X多线程和内存管理》
- Java菜鸟面试突破系列Java集合源码解读系列:HashMap实现原理
- 论坛源码推荐(8月14日):基于高德地图iOS SDK的轨迹回放库,用Swift实现的设计模式
- iOS与OS多线程和内存管理----GCD底层实现
- iOS内存管理和malloc源码解读
- zorka源码解读之tracer内部实现
- Android设计模式系列(1)--SDK源码之组合模式
- ReactiveSwift源码解析(九) SignalProducerProtocol延展中的Start、Lift系列方法的代码实现
- ios开发学习--动画(Animation)效果源码分享--系列教程1
- Dubbo源码分析系列-扩展机制的实现
- 逆向iOS SDK -- +[UIImage imageNamed:] 的实现
- 第7课:Spark Streaming源码解读之JobScheduler内幕实现和深度思考
- 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)
- iOS之OC源码,相册循环查看功能的实现
- Yii2底层源码解读系列之一 入口文件index.php
- 源码分析五(HashSet的内部实现)
- MPAndroidChart系列源码解读(一)
- 数据结构算法之排序系列Java、C源码实现(3)--直接选择排序
- iOS应用程序实现内部多语言的具体项目应用