GCD除了主要的Dispatch Queue外,还有Dispatch Source。
它是BSD系内核惯有功能kqueue的包装。
kqueue是在XNU内核发生各种事件时,在应用程序编程方执行处理的技术,其CPU负荷非常小,尽量不占用资源。可以说是程序处理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_TIMER类型,指定Main Dispatch Queue执行追加的处理
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
// 定时器为5秒后,不指定为重复,允许延迟1秒
dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, 5ull * NSEC_PER_SEC), DISPATCH_TIME_FOREVER, 1ull * NSEC_PER_SEC);
NSLog(@"设置定时器");
// 定时器指定时间内执行的处理
dispatch_source_set_event_handler(timer, ^{
NSLog(@"wakeup!");
// 取消Dispatch Source
dispatch_source_cancel(timer);
});
// 取消Dispatch Source
dispatch_source_set_cancel_handler(timer, ^{
NSLog(@"canceld");
// 释放Dispatch Source(自身)
//dispatch_release(timer);
});
// 启动Dispatch Source
dispatch_resume(timer);
说明:
对比Dispatch Queue可以发现,Dispatch Queue没有“取消”这一概念,而Dispatch Source是有“取消”的,而且取消时必须执行的处理可以指定为回调用的Block形式。
Dispatch Source实现XNU内核中发生的事件处理要比直接使用kqueue实现更为简单。
在必须使用kqueue的情况下还是使用Dispatch Source比较简单。