上一篇《分析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. LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)

    LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组) 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:h ...

  2. CocosCreator中_worldMatrix到底是什么(下)

    Cocos Creator 中 _worldMatrix 到底是什么(下) 1. 摘要 上篇介绍了矩阵的基本知识以及对应图形变换矩阵推倒.中篇具体介介绍了对应矩阵转换成cocos creator代码的 ...

  3. 图片放大缩小插件 zoom.js 怎么用

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...

  4. 【MongoDB详细使用教程】五、MongoDB的数据库管理

    目录 1.数据库安全 1.1.创建管理员账号和密码 1.2.设置服务状态为需要验证用户 1.3.创建用户账户和密码 1.4.忘记密码/修改密码 2.主从服务器 2.1.创建服务器目录,用于分别存放主从 ...

  5. OptimalSolution(2)--二叉树问题(3)Path路径问题

    一.在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树和一个32位整数sum,求累加和为sum的最长路径长度.路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链 -3 / ...

  6. vue订阅者模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Linux基本指令与作用

    在Linux操作系统中,有不同于windows的操作,可以用指令来进行操作. 指令 ls:查看文件 ls -a:查看隐藏文件 cd:移动到某个路径之中 clear:清屏rm:删除touch:创建mv: ...

  8. Java 8 - 行为参数化

    前言: 以下内容来源于java8实战一书,我将里面学习的内容做一个整理,方便没空读书的小伙伴快速入门实战java8 正文: 假设一个果农收获了一园的苹果,他需要你根据他的条件筛选出满意的苹果 首先我们 ...

  9. 小白学 Python(17):基础数据类型(函数)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  10. MIT线性代数:4.A的LU分解