在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. Spring容器启动源码解析

    1. 前言 最近搭建的工程都是基于SpringBoot,简化配置的感觉真爽.但有个以前的项目还是用SpringMvc写的,看到满满的配置xml文件,却有一种想去深入了解的冲动.折腾了好几天,决心去写这 ...

  2. vue实现简单学生信息管理案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. LeetCode初级算法--设计问题01:Shuffle an Array (打乱数组)

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

  4. 基础安全术语科普(四)——RFID

    RFID —— Radio Frequency Identification (射频识别技术) 概念:RFID属于一种无源技术(Passive Technology) 使用:生活中RFID无处不在.如 ...

  5. JAVA NIO 获取udp数据报的 发送方ip

    程序是通了,但是没法转发,获取不到对方ip.nio中 udp使用的是DatagramChannel ,但是SelectorKey.channel()转化之后的DatagramChannel,调用get ...

  6. 设计模式C++描述----07.建造者(Builder)模式

    一. 概述 Builder 模式要解决的问题是:当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开 来,这样做的好处就是通过一步 ...

  7. 在ArangoDB中实现connectedcomponents算法

    操作环境: tool:ArangoDB 3.3.13 操作系统:Debian 7.2.0-20 概念: Connected Components即连通体算法.用id标注图中每个连通体,将连通体中序号最 ...

  8. leetcode算法小题(3)

    问题描述: 判断一个数是否为回文数 class Solution {      public boolean isPalindrome(int x) {           if(x<0)    ...

  9. [考试反思]1002csp-s模拟测试57:平庸

    一天两场,感觉要完. 不粘排行榜,太壮观了. #1:190 #2:180 #4:160 #35:150 #37:140 #39:120 #kx:20呃... 最后一个是考试结束后了. 又是CE盖40分 ...

  10. csp-s 66

    我向来只在考砸的时候写博客.这次题很水,但是我极没有状态,我T1没看题目前面的话: 不知道这个条件的我蒙蔽的答题.推各种柿子,想这个矩阵的特殊构造,就是同行的构造,然后我T1想了1个多小时,然后死了! ...