第三章 3.3.2 Dispatch Source

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比较简单。

你可能感兴趣的:(第三章 3.3.2 Dispatch Source)