在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. go-关键字-变量

        var 声明变量 const 常量的关键字, 常量不能出现只声明不赋值的情况. 名字首字母为大写的程序实体可以被任何代码包中的代码访问到. 名字首字母为小写的程序实体则只能被同一个代码包中的代 ...

  2. HDU 3371 Connect the Cities(并查集+Kruskal)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3371 思路: 这道题很明显是一道最小生成树的题目,有点意思的是,它事先已经让几个点联通了.正是因为它先 ...

  3. 2.Linux Bash认识

    虚拟机快照操作 1.什么是Bash shell? 它就是命令解释器,将用户输入的指令翻译给内核程序,内核处理完成之后将结果返回给Bash 2.Bash shell的用途? 几乎能完成所有的操作: 文件 ...

  4. [洛谷P3709]大爷的字符串题

    题目传送门 不用管它随机什么的,就用贪心的思想去想, 会发现这道题的实质是:求查询区间众数出现次数. 莫队即可解决. 注意字符集1e9,要离散化处理. #include <bits/stdc++ ...

  5. C#扩展一般用于linq

    下面是dictionary的扩展 using System.Collections.Generic; namespace NetAnalysis.Common { public static clas ...

  6. 在Mac OSX上运行Windows应用程序

    在Mac OSX中,借助wine,不需要安装虚拟机也可以运行Window应用程序. wine是一个在Linux和UNIX之上的,WIndows3.x和Windows APIs的实现.是运用API转换技 ...

  7. 基于 HTML5 + Canvas 实现的 PID 可视化系统

    前言 随着工业物联网和互联网技术的普及和发展,人工填料的方式已经逐渐被机械设备取代.工业厂商减小误操作.提升设备安全以及追求高效率等制造特点对设备的要求愈加高标准.严要求.同时机械生产以后还需遵从整个 ...

  8. Redis(七)Redis的噩梦:阻塞

    为什么说阻塞是Redis的噩梦: Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的.当Redis用于高并发场景时,这条线程就变成了它的生命线.如果出现阻塞,哪怕是很短时间,对于应用 ...

  9. Amazon S3数据存储

    从官网下载aws 的unity插件,并做了简单修改(主要用修改PostObject),问题: (一)获取Pool ID 通过服务-Cognito-管理/新建用户池,可以新建或者获取Pool ID (二 ...

  10. SpringCloud配置中心集成Gitlab(十五)

    一 开始配置config服务 config-server pom.xml <dependency> <groupId>org.springframework.cloud< ...