在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现。

主要目的是将operation集中成一个事务,使所有operation的completion同步到整个事务结束之后。这样的效果使得加入到事务中的operation不会因为完成的事件而过早或个别地执行。例如一个Layer的display或layout operation连带引起了sublayers的display和layout operations,有必要将所有这些operations加入到一个事务当中,(在提供异步operation的情况下,)使得它们的completion可以同步到事务结束,并且是按加入的顺序进行执行。

dispatch_group提供的full semaphore同步机制正好能满足实现事务处理的要求。

下面_ASAsyncTransaction工作原理的活动图:

_ASAsyncTransaction提供了两个主要的事务操作分别是-addOperationWithBlock:queue:completion:和-commit;

分别对应于加入到事务,以及事务提交。从图中可以看出加入到事务的操作并不需要等待到事务提交才开始执行,而是立即异步分派执行。而事务的提交并不是针对加入到事务的操作,发起开始执行,而是将operation的completion的集中处理加入到dispatch_group的notify队列,在事务结束时可以被执行。也可以这样认为,提交的是completion,要么全部被执行, 在所有加入到事务的operations被执行完;要么一个都不执行,只要还有那么一个operation还没有完成执行。决不会因为个别operation完成了就开始了它们对应的completion。

这样可以扩展来阅读,NSOperationQueue也提供了类似的服务,对应上面的事务操作分别是-addOperationWithBlock:和-waitUntilAllOperaionsAreFinished。只不过_ASAsyncTransaction提供了针对operation-completion应用场合事务支持,NSOperationQueue的-waitUntilAllOperationsAreFinished必须阻塞等待,形成事务同步。

当然读到这里,上面提到的事务是不支持回滚(rollback)。

忘记说了,用于回调分派completion的_callbackQueue是绑定了dispatchMainQueue的。

最后多谢路过的你观看本文。

最后

分析facebook的AsyncDisplayKit框架中的Transaction的工作原理的更多相关文章

  1. 分析facebook的AsyncDisplayKit框架,async-display使用async-transaction

    上一篇<分析facebook的AsyncDisplayKit框架中的Transaction的工作原理>介绍了fb的asdk的异步事务ASAsyncTransaction,本篇介绍其在asd ...

  2. drf框架中认证与权限工作原理及设置

    0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...

  3. Spring框架中IoC(控制反转)的原理(转)

    原文链接:Spring框架中IoC(控制反转)的原理 一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作, ...

  4. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  5. 深入ObjC GCD中的dispatch group工作原理。

    本文是基于GCD的支持库libdispatch的源代码分析的结果或是用于作为源代码阅读的参考,尽量不帖代码,力求用UML图来说明工作流. 本文参考的源代码版本为v501.20.1,如有兴趣请自行到苹果 ...

  6. 解析ABP框架中的事务处理和工作单元,ABP事务处理

    通用连接和事务管理方法连接和事务管理是使用数据库的应用程序最重要的概念之一.当你开启一个数据库连接,什么时候开始事务,如何释放连接...诸如此类的. 正如大家都知道的,.Net使用连接池(connec ...

  7. scrapy 基础组件专题(一):scrapy框架中各组件的工作流程

    Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): Scrapy主要包括了以下组件: 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事 ...

  8. 浏览器中“JavaScript解析器”工作原理

    浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...

  9. 分析RedisRDB和AOF两种持久化机制的工作原理及优劣势

    一.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only(追加)的模式写入一个日志文件中,在redi ...

随机推荐

  1. 电脑扫描不出u盘的解决办法

    现象:u盘已插上但是设备和驱动器里却找不到 解决办法: 首先记下u盘名称,然后 我的电脑-右键-管理-设备管理器,找到u盘,卸载设备后重新插入u盘即可

  2. linux上war包方式安装Jenkins

    我的安装环境:jdk1.8, linux系统为: [root@ipha-dev71-1 nmon]# cat /etc/redhat-release # Linux查看版本当前操作系统发行版信息 Ce ...

  3. LeetCode 5024 除数博弈 --(简单博弈论)

    今天在LeetCode的看到一到题目 这道题目有点坑,没有思路的话容易钻牛角. 刚刚开始时,我想的是直接用while循环来模拟计算,后来觉得这么好麻烦,也有复制的逻辑在里面.后面我推导了一下 以下是我 ...

  4. C语言 二叉树的遍历(递归和非递归)

    #include <iostream> #include <cstdio> #include "biTree.h" #include "cstdl ...

  5. todoList.html

    待做的事情 {{item}} 完成 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  6. 关于dt分组、计数、排序的实例

    #region table去重复求和 var query = dt.Rows.Cast<DataRow>() .OrderByDescending(n => n["OPER ...

  7. Spring Boot 快速入门 史上最简单

    1.Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的 ...

  8. phpstorm 2016.2.2 激活

    2016年7月14日 phpstorm 推送2016.2 更新 2016年10月25日phpstorm 推送2016.2.2 更新 2016年11月24日phpstorm 推送2016.3 更新 下面 ...

  9. Ubuntu 18.04 下安装pip3及pygame模块

    1.Ubuntu下pip3的安装.升级.卸载 安装pip3 sudo apt-get install python3-pip 升级pip3 sudo pip3 install --upgrade pi ...

  10. 一些 bypass WAF 技巧

    也是之前讲课写的,现在搬运过来 --- WAF所处的位置 * 云WAF * 硬件WAF * 软件WAF * 代码级WAF   WAF的绕过 1 架构层    1 对于云WAF,寻找真实ip       ...