美文网首页
第三章 3.3.2 Dispatch Source

第三章 3.3.2 Dispatch Source

作者: MrSYLong | 来源:发表于2018-07-28 18:47 被阅读2次

    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

          本文链接:https://www.haomeiwen.com/subject/nstamftx.html