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. 怎么提高面试成功率?
  2. 这 56 个代码注释让我笑吐了
  3. react中使用构建缓存_通过在React中构建Tic Tac Toe来学习ReasonML
  4. 3 SAP STMS跨服务器传请求号
  5. Android之旅--Handler与多线程
  6. java 判断date为空_java – 如何检查JSONArray元素是否为空
  7. 云熙板式家具参数化拆单软件免锁版_数控开料机拆单软件如何选择?
  8. 湘潭大学计算机科学,湘潭大学计算机科学和技术一级学科.doc
  9. 出现net.sf.json.JSONException: There is a cycle in the hierarchy异常的解决办法
  10. 分享我用cnode社区api做微信小应用的入门过程
  11. 拼多多上市关你什么事?
  12. 一键清空服务器文件,一键清理操作系统垃圾文件的BAT
  13. java web问卷调查设计方案_Java web 调查问卷
  14. 前端和后端的英文_前端开发与架构师
  15. 基于PHP、MySql的宿舍管理系统
  16. 汽车开发节点 ET、PT、SOP
  17. pycharm怎么修改html的字体大小,怎么改pycharm的字体大小
  18. html+css 制作简单QQ登录页面
  19. 为Greenplum 增加mirror节点
  20. go 字符串分割数组

热门文章

  1. 迪杰斯特拉算法(Dijkstra‘s algorithm)以及示例
  2. “毒舌”专家解析大数据应用案例Part2—三星盖乐世社区 DSP跨屏投放
  3. 大数据应用案例【创新需要大数据】
  4. paxos算法详解以及模拟代码
  5. Web 2.0界面设计模式
  6. 拟合函数参数和误差--最小均方根
  7. 初识Django(一):Django简介
  8. hive-diea-ETL数据截取split,嵌套SQL查询,ETL-SQL表查询中间件解析
  9. MB1C MIGO入库时【不可能为条目A999 GBB CN01 BSA 7920确立帐户】解决方案
  10. [C++]责任链模式