EasyReact 初读

简介

响应式编程是基于数据流动编程的一种编程范式

KVO 帮助我们将属性的变更变更后的处理分离开,大大简化了我们的更新逻辑

响应式编程将这一优势体现得更加淋漓尽致,可以简单的理解成一个对象的属性改变后,另外一连串对象的属性都随之发生改变。

客户端程序本身充满异步的场景,在业务逻辑愈发复杂的情况下,响应式编程就是解决更新逻辑的一种手段。

EasyReact 是美团开源的一套响应式编程开发框架。

在已有的ReactiveCocoa 里,iOS 开发上手响应式编程是一个挑战,主要原因如下:

1、高学习门槛

2、易出错

3、调试困难

4、风格不统一

EasyReact 的出现就是为了降低 iOS 的响应式编程开发难度。


框架概述

1.1、理论基础

框架的理论基础是图论中的有向有环图。由节点和边构成了数据的连接,边的方向表达了流动方向。

1.2、类与协议

类节点(EZRNode<T>,EZRMutableNode<T>)和协议边(EZREdge,EZRTransformEdge,EZRListenEdge,EZRNextReceiver);

EasyReact 没有提供,也不推荐定制节点。

EZRTransform 是 EZRTransformEdge 协议的一个默认实现类,想要定制自己的边只需要继承 EZRTransform 类并覆盖数据下发的方法就可以了。

EZRListen 是 EZRListenEdge 协议的一个默认实现类,EZRBlockListen 和 EZRDeliveredListen 是 EZRListen 类的两个子类,可以方便的指定 block 和 GCD 的 queue 来完成监听,通常情况下可以满足我们的需要。

1.3、上下游

数据的流动是有方向的。因此数据的提供者叫做上游,数据的需求者叫做下游。上游和下游是一个逻辑上的概念。

为了方便遍历和深度、广度搜索,每个节点都拥有upstreamNodes、downstreamNodes、upstreamTransforms、downstreamTransforms等聚合属性用来获得上下游的边和节点。另外,也提供了查询两个节点间的所有上/下游变换的方法。

1.4、连接和数据流动

响应式编程的过程就是描述节点与节点、节点与监听者的关系,最终构成响应图的过程。

本框架中所有的节点关系都是可以后期改变的,所以可以随时通过遍历和修改的方式来改变现有的响应图。

一种特殊情况是节点环。当节点相互成为下游的时候便形成了节点环,例如a --> b --> c --> a形成了一个a,b,c 的三角形节点环。节点环的数据流动是不会循环的,我们通过传递方法的参数senderList 来避免循环。所以当b改变的时候,c会随之改变,然后再改变 aa在数据传递的时候发现senderList中已经包含了 b所以不会继续向b传递数据,从而终止了循环。


内存管理

对于一个基于图论的框架来说,节点和边是最小的部件。实际应用中,这些部件构成了各种有向图。比如一个有环图,它的数据流动就是一个环形,部件之间的持有关系如果不能很好的处理,那么可能就会存在内存问题。EasyReact 的内存管理逻辑非常简单,也非常精巧。可以让框架使用者无需关注太多的细节即可轻松的使用,而不必担心本框架涉及的内存方面的问题。

2.1、生命周期

在本框架中,节点、变换、监听边和监听者组成了有向图的结构,维系着数据的响应关系。由于本框架是面向对象的响应式框架,所以节点、变换、监听边和监听者都是对象。不管是否保存了中间节点,如何维持这些对象的生命周期来让整个响应关系保持稳定,是一个重要的问题。

本框架中,节点、变换、监听边和监听者的持有规则如下:

1、一个监听者强持有了其所有上游监听边;

2、一个边的 from 强持有了一个节点,而 to 弱引用了下游节点或者监听者;

3、一个节点强持有了其所有的上游变换,弱引用了其所有下游变换和下游监听边。

也就是说,在一个响应链中,始终是数据的消费者持有了数据的提供者。当数据不再有消费者时,数据的提供者也就没有必要存在了

2.2、self 与监听边循环问题

需要注意的是通常我们在监听的方法里面会使用到 self,前面提到过 self 已经持有了监听边,如果监听边捕获了 self,将会出现循环引用从而引起内存泄露。为此我们提供了 @ezr_weakify(...) 和 @ezr_strongify(...) 来解决循环引用的问题。

2.3、节点环循环问题

框架设计中已经处理了对上游链路的强引用,所以节点环就会产生循环引用,一旦产生需要记得必要的时刻进行主动的破除操作,

请务必记得在必要的时刻对任意的边或者点进行破除操作

1、破除边 transformAtoB.from = nil;

2、 或破除点 [nodeA removeDownstreamNode:nodeB];

2.4、节点间数据同步循环问题

通常情况下我们会对两个节点进行同步而不是更多节点,它们都提供了id<EZRCancelable>这个对象,通过该对象的- (void)cancel方法,我们就可以快速的破除这两个节点的环了,


优缺点

3.1、不支持上游销毁下游节点

EasyReact 统一使用下游对象持有上游对象,上游对象的生命周期依赖下游对象,无法独立销毁。

为了解决这个问题,必须保证:

监听者应当直接持有被监听者

监听者早于被监听者销毁,或者同步销毁

在 iOS MVVM 架构中,View 和 ViewModel 刚好满足上述两条要求。不管是 View 和 ViewModel 之间进行数据绑定,还是 ViewModel 内部做代码精简,都可以正常使用 EasyReact。

3.2、没有对系统类的扩展,易用性大打折扣

3.3、效率在 RAC 的三倍以上

3.4、调试难度更低

每个节点自带一个value,且都拥有upstreamNodes、downstreamNodes、upstreamTransforms、downstreamTransforms等聚合属性用来获得上下游的边和节点。

3.5、文档齐全,官方中文


未来

整体结构图

参考:https://tech.meituan.com/2018/07/19/react-programming-framework-easyreact-opensource.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容