上一篇《分析facebook的AsyncDisplayKit框架中的Transaction的工作原理》介绍了fb的asdk的异步事务ASAsyncTransaction,本篇介绍其在asdk异步如何应用这个异步事务。

这个图的中心点是transaction group连结了两个框架,左边是QuartzCore`CALayer的是display的显示框架,右边是CoreFundation`CFRunLoop的主循环框架。Adsk的将CALayer扩展成ASDisplayLayer,在CALayer的display显示框架中应用异步显示时,将会使用Adsk的事务框架(,ASAsyncTransaction),所有事务都会被集中到一个事务组统一提交。而提交的机会(或者说时间地方)是依赖在RunLoop中的某一个运行阶段。

CALayer使用了异步事务,就会将自身或包含自己的容器(CALayer(ASDisplayNodeAsyncTransactionContainer))登记在异步事务组。

异步事务组,只有一个单例,向RunLoop登记了作为BeforeWaiting和Exit两个运行阶段的观察者。并在观察者通知回调时,提交事务。

如果你熟读CFRunLoop模块的代码并通过调试深入试探过UIKit的执行流,就会清楚BeforeWaiting是在RunLoop处理完source0事件之后,在将进入mach_port等待之前,RunLoop设立的一个观察点。而UIKit有一条事件队列_UIApplicationHandleEventQueue,而这个队列挂接在一个source0上(,CFRunLoopSource0可以被RunLoop发起的事件),例如touch输入就会被post到这个事件(注意与event source的区分)队列中。RunLoop在处理完全部fired的source0后才会到达BeforeWaiting阶段,也就是在UIKit的事件队列处理之后。

异步事务组还向RunLoop登记了在Exit处观察,因为RunLoop可能运行在一次过的模式,在使用了异步事务功能之后,就直接要结束一次性的RunLoop循环,到达Exit。如果没有登记观察这个阶段,异步事务组将可能永远不会有机会提交。

分析facebook的AsyncDisplayKit框架,async-display使用async-transaction的更多相关文章

  1. 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理

    在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...

  2. [源码分析] Facebook如何训练超大模型---(1)

    [源码分析] Facebook如何训练超大模型---(1) 目录 [源码分析] Facebook如何训练超大模型---(1) 0x00 摘要 0x01 简介 1.1 FAIR & FSDP 1 ...

  3. 《k8s-1.13版本源码分析》-调度器框架

    本文原始地址(gitbook格式):https://farmer-hutao.github.io/k8s-source-code-analysis/core/scheduler/scheduler-f ...

  4. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  5. [源码分析] Facebook如何训练超大模型 --- (2)

    [源码分析] Facebook如何训练超大模型 --- (2) 目录 [源码分析] Facebook如何训练超大模型 --- (2) 0x00 摘要 0x01 回顾 1.1 ZeRO 1.1.1 Ze ...

  6. [源码分析] Facebook如何训练超大模型 --- (3)

    [源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...

  7. async包 ES6 async/await的区别

    最基本的async 包 ApCollection.find({}).toArray(function (err, aps) { var num = 0; async.whilst( function ...

  8. UML分析AsyncDisplayKit框架-ASMuplexImageNode异步下载时序图。

    PS:博客园图片服务器不正常工作,数据上传后服务器返回http500,园方迟迟还没解决. 我从2016-01-18 05:52向园方反馈问题-请问博客园的图片服务器有在正常运行吗,至此时2016-01 ...

  9. linux 时钟源初步分析linux kernel 时钟框架详细介绍

    初步概念: 看datasheet的关于时钟与定时器的部分, FCLK供给cpu, HCLK供给AHB总线设备(存储器控制器,中断控制器.LCD控制器.DMA.USB主机控制器等), PCLK供给APB ...

随机推荐

  1. 常用函数-Win-IP

    //************************************************************************* // 函数名: GetAppPath // 返回 ...

  2. 关于在vue-cli脚手架中使用CDN引入element-ui不成功的坑

    在前端开发过程中,为了减少最后打包出来的体积,我们会用到cdn引入一些比较大的库来解决. 常见我们引入的element-ui库,在最近使用cdn引入时,无论如何都引入不成功,其他的如Vue.vue-r ...

  3. java中JVM内存管理(1)

    Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?  可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点 ...

  4. Node环境搭建--详细教程

    下载地址: https://nodejs.org/en/download/ 版本:10.15.3 检测是否安装成功:我之前安装的是10.14版本

  5. 透明度设置opacity

    透明度设置opacity属性 示例 <!DOCTYPE html> <html> <head> <style> div { background-col ...

  6. ofd电子文档内容分析工具(分析文档、签章和证书)

    前言 ofd是国家文档标准,其对标的文档格式是pdf.ofd文档是容器格式文件,ofd其实就是压缩包.将ofd文件后缀改为.zip,解压后可看到文件包含的内容. ofd文件分析工具下载:点我下载.获取 ...

  7. SpringBoot系列之@Value和@ConfigurationProperties

    继上一篇博客SpringBoot系列之YAML配置用法之后,再写一篇@Value.@ConfigurationProperties的对比博客 这两个主键都是可以获取配置文件属性的,不过是有比较大的区别 ...

  8. sqlmap日常使用

    收集的一些技巧资源来之互联网 -u #注入点 -f #指纹判别数据库类型 -b #获取数据库版本信息 -p #指定可测试的参数(?page=1&id=2 -p "page,id&qu ...

  9. 使用“反向传播”迭代法求解y=√10

    X=√10,求X,也就是求Y=10 =X2 , X是多少. *重要的思想是,如何转化为可迭代求解的算法问题. *解数学问题,第一时间画图,求导,“直线化”. Y = X2 假如已知Y = 10 ,要求 ...

  10. LNMP+Redis

    如果要让php支持redis需要安装php-redis模块.可以再github上下载哦. https://github.com/phpredis/phpredis 配置lnmp环境,太简单了就不演示了 ...