CFRunloopSource

CFRunloopSource 定义

struct __CFRunLoopSource {CFRuntimeBase _base;uint32_t _bits; //用于标记Signaled状态,source0只有在被标记为Signaled状态,才会被处理pthread_mutex_t _lock;CFIndex _order;         /* immutable */CFMutableBagRef _runLoops;union {CFRunLoopSourceContext version0;     /* immutable, except invalidation */CFRunLoopSourceContext1 version1;    /* immutable, except invalidation */} _context;
};

结论:

  1. 一个 source 可以放在多个 runloop 中
  2. CFRunLoopSource 是对 input sources 的抽象,它要么是 source0,那么是 source1

Source0

typedef struct {CFIndex version;void *  info;const void *(*retain)(const void *info);void    (*release)(const void *info);CFStringRef (*copyDescription)(const void *info);Boolean (*equal)(const void *info1, const void *info2);CFHashCode  (*hash)(const void *info);void    (*schedule)(void *info, CFRunLoopRef rl, CFStringRef mode);void    (*cancel)(void *info, CFRunLoopRef rl, CFStringRef mode);void    (*perform)(void *info);
} CFRunLoopSourceContext;
  • source0 是 App 内部事件,如:UIEvent,CFSocket。
  • source0 是基于非 port 的,只包含一个回调(函数指针),并不能主动触发事件。使用时,先调用 CFRunloopSourceSignal(source) 标记为待处理,然后手动调用 CFRunloopWakeUp(runloop) 来唤醒 runloop,让其处理这个事件。

Source1

typedef struct {CFIndex version;void *  info;const void *(*retain)(const void *info);void    (*release)(const void *info);CFStringRef (*copyDescription)(const void *info);Boolean (*equal)(const void *info1, const void *info2);CFHashCode  (*hash)(const void *info);
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET

Runloop 学习之 CFRunloopSource相关推荐

  1. ios runloop学习

    今天突然才之间才意识到NSTimer这样的运行方式,是在多线程中实现的循环还是在主线程中去实现的呢.当然不可能是在主线程中的while那么简单,那样什么都干不了,简单看了下NSTimer是以同步方式运 ...

  2. 整理的一篇iOS面试题大全

    #一.基础知识点 1. 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情. 1). MVC模式:Model View Contro ...

  3. 整理一篇很全面的iOS面试题

    (答案不唯一,仅供参考,文章最后有福利) 目录 一.基础知识点 二.第三方框架 三.算法 四.编码格式(优化细节) 五.其他知识点 一.基础知识点 设计模式是什么? 你知道哪些设计模式,并简要叙述? ...

  4. 历史文件备份,原文件已损失

    zzf073的博客 - 第6页 - DevDiv开发者社区 - Powered by DEVDIV.COM! zzf073的博客 - 第4页 - DevDiv开发者社区 - Powered by DE ...

  5. 我常去逛的iOS干货文章、blog等

    俗话说,三人行必有我师焉. 总有些知识别人知道,你是不知道的. 感谢开源,感谢分享.我们学习才不会走太多弯路. 所以才会有如此多的好blog.好文章. 以下网站不分排序. 1.1. 喵神-OneV's ...

  6. RunLoop的学习

    什么是Run Loops RunLoops是与线程相关联的基础部分,一个Run Loop就是事件处理循环,他是用来调度和协调接收到的事件处理.使用RunLoop的目的,就是使的线程有工作需要做的时候忙 ...

  7. Runloop底层原理--源码分析

    什么是Runloop? Runloop不仅仅是一个运行循环(do-while循环),也是提供了一个入口函数的对象,消息机制处理模式.运行循环从两种不同类型的源接收事件. 输入源提供异步事件,通常是来自 ...

  8. RunLoop总结与面试

    之前关于RunLoop只知道一点,最近花时间重新系统的学习了一下,以下是我的学习笔记及总结.有不足的部分,望大佬不吝赐教. 1.RunLoop 概念 计算机处理任务有进程和线程的概念,而在iOS中一个 ...

  9. iOS底层原理探究-Runloop

    Runloop 1. 概述 一般来说,一个线程只能执行一个任务,执行完就会退出,如果我们需要一种机制,让线程能随时处理时间但并不退出,那么 RunLoop 就是这样的一个机制.Runloop是事件接收 ...

最新文章

  1. 读书-算法《程序设计导引及在线实践》-简单计算题5:装箱问题
  2. 项目管理其实可以简单一点——任务分工
  3. java redis 商品秒杀_redis编写lua脚本实现商品秒杀
  4. 服务器c的环境配置文件,配置linux服务器环境(jdk+tomcat+mysql+nginx+redis+svn+nexus的maven私服)...
  5. 腾讯自动驾驶新动作!与现代合作开发无人车系统
  6. blog.1z5k.com
  7. mysql 的相关操作_MySQL(记录相关操作)
  8. 【MISC怼题入门系列】BUU-MISC-page1
  9. 功率放大器的设计要点
  10. VTN_Virtual Tenant Network——虚拟租赁网络
  11. vue-学生信息管理系统
  12. 王之泰201771010131《面向对象程序设计(java)》第十三周学习总结
  13. 水花兄弟(Splash Brothers)
  14. 从零开始实现放置游戏(一)——游戏设计
  15. 第三方ZXing库zxing-android-embedded使用及自定义
  16. ElasticSearch自定义分析器(custom analyzer)
  17. 2021-2027全球与中国冰球护具市场现状及未来发展趋势
  18. 赶紧注册你的@live.xx邮箱吧!
  19. 2022-05-首都师范大学-博弈论-焦宝聪
  20. X61T L7500割脉超频成功!

热门文章

  1. 我是曾经的“网瘾少年”,靠自学编程走出了大山
  2. swift3.0中@escaping 和 @noescape 的含义
  3. C#获取内存地址的值
  4. input事件中文触发多次问题研究
  5. 【音频】Mya Marie Harrison的精品音樂
  6. 编程c语言中,向上取整函数_C编程中的函数–第3部分
  7. fpga实现YCbCr422转YCbCr444
  8. 张一鸣宣布卸任字节跳动CEO,网友:想以个人名义上富豪榜;​腾讯第一季度员工平均月薪7.6万元;谷歌发布自然语言平台LaMDA...
  9. php yii框架addselect,PHP Yii框架之数据库查询操作总结
  10. 为什么岳灵珊选择了平之?