ReactiveSwift源码解析(十二) MutableProperty基本代码实现
前两篇博客我们分别聊了ReactiveSwift框架中的负责标记对象的生命周期的类Lifetime以及负责原子性操作的Atomic类的具体代码实现。前两篇博客之所以聊Lifetime以及Atomic的代码实现,就是为了今天这篇博客做铺垫的。在Property以及MutableProperty的代码实现中我们会用到Lifetime以及Atomic。本篇博客我们就来仔细的探讨一下Property以及MutableProperty的代码实现。
因为MutableProperty用处更多,而且MutableProperty的代码实现比Property要复杂一些,那么本篇博客我们就以MutableProperty为例来看一下其代码实现。之所以在本篇博客中聊Property的代码实现,在于之前我们已经陆陆续续的聊了Event、Observer、Signal、SignalProducer、Lifetime以及Atomic的代码实现。而Property就是在上述基础上的进一步封装。
下方我们先来看一下MutableProperty的一个简单的使用示例,然后根据该示例来看一下MutableProperty的基本代码实现。看完基本代码实现后,下方也会根据相应的示例来看一下Property的一些常用的扩展方法的具体实现。
一、MutableProperty的简单应用示例
我们还是由简到繁的步骤,本部分我们会给出两个MutableProperty使用的简单示例。一个是关于Property中的Signal的,另一个是关于Property中的SignalProducer的。下部分内容我们会给据该部分的示例以及示例的输出结果来分析MutableProperty具体的代码实现。
1、MutableProperty中的Signal对象
下方示例展示了MutableProperty中的signal对象的使用方式。下方是对该段代码的解释:
首先我们创建了一个可变的属性对象mutableProperty,该属性的初始值为1。
然后给该属性对象中的signal对象添加一个Value事件的观察者,在该观察者中输出所观察到的值Value。当mutableProperty所关联的值被修改时,就会执行该观察者所对应的事件闭包。
接着我们就修改mutableProperty对象的value的值,将该值修改成10。然后就获取该值进行输出

上述截图的最下方就是该示例的输出结果,从该结果中我们不难看出,当可变属性被赋值时Value事件的闭包体就会执行。而通过withValue以及value属性就可以获取到该值。在获取值时不会执行上述闭包事件。
2、MutableProperty中的SignalProducer对象
下方是MutableProperty中SignalProducer对象的简单使用示例。下方代码示例与上方的代码片段类似,输出结果也差不多,只不过SignalProducer对象的Value事件会先输出当前MutableProperty对象中所存储的值。当修改MutableProperty中所存储的值时,就会执行SignalProducer中内置的Signal的Value事件。具体如下所示:

二、MutableProperty类的基本实现
看完第一部分的MutableProperty的简单的使用方式,接下来我们就来看一下MutableProperty类的基本实现。MutableProperty类的基本实现是比较简单的主要包括Signal、Observer对象的初始化,还有Lifetime对象的初始化,以及Atomic对象的初始化操作。而MutableProperty类的核心方法都在其扩展中,稍后会介绍到。接下来我们先看一下MutableProperty中的属性、构造器以及基本方法。
1、MutableProperty的属性以及构造器
下方代码片段就是MutableProperty中的核心属性以及主要的构造器,如果详细的看了之前的博客的话,下方这几个属性并不陌生,接下来我们来一一介绍:
token和lifetime属性负责标记MutableProperty的生命周期,关于Lifetime的代码实现与具体工作方式,请移步于《Lifetime代码实现》。
signal与observer则负责在修改value值时给观察者发送事件的,Signal与Observer的具体代码实现以及工作方式在之前的博客中也详细的介绍过来,在此不做过多赘述了。
atomic属性则负责原子操作的,从下方的atomic的属性类型我们可以看出该原子操作添加的是递归锁。关于Atomic的详细内容我们之前的博客也介绍过了,详情请移步于《Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁》。
value属性是一个计算属性,其中的get和set方法主要是调用atomic属性中的相应的方法进行值的获取和赋值操作。
producer属性也是一个计算属性,其中返回了一个SignalProducer类的对象。从代码中我们不难看出该producer对象中的signal对象与MutableProperty中的signal对象进行了桥接,也就是说,该producer属性可以收到来自MutableProperty中信号量的事件。关于SignalProducer的详细内容请移步于《SignalProducer的基本实现及使用方式》。
MutableProperty的构造器就是对上述这些未被初始化的属性进行初始化了。其中需要注意的一点是Atomic对象的初始化,在atomic属性初始化是,将observer属性的Value事件的执行块赋值给了didSet闭包。所以当atomic中的value值被修改后就会调用observer的send(value)事件,这一点在MutableProperty中还是比较重要的。

根据上述代码的属性以及构造器,我们不难画出下方这个简图。该图给出了上述属性的各种关系,以及当MutableProperty的Value值被修改时,SentValue事件的走向,具体如下所示。

2、MutableProperty类中基本方法的代码实现
接下来我们就来看一下MutableProperty类中其他方法的实现。下方就是MutableProperty类中剩余的方法,下方的方法比较简单,主要是对atomic属性中相关方法的二次封装,具体如下所示:

今天的博客就先到这儿,下篇博客我们会挑一些MutableProperty的扩展方法中比较重要和基础的方法进行介绍。Property以及MutableProperty中的其他扩展方法大部分都是在SignalProducer以及Signal的基础上所建立起来的,功能也是大同小异,在此就不做过多赘述了。
上述代码github分享地址:https://github.com/lizelu/TipSwiftForRac。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #ffffff }
span.s1 { }
ReactiveSwift源码解析(十二) MutableProperty基本代码实现的更多相关文章
- ReactiveSwift源码解析(十) Lifetime代码实现
为了之后博客的进行,本篇博客我们就来聊一下ReactiveSwift框架中的Lifetime类的具体实现.从Lifetime这个名字中我们就这道,就是生命周期.在ReactiveSwift中使用Lif ...
- ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现
上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...
- ReactiveSwift源码解析(三) Signal代码的基本实现
上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...
- Cwinux源码解析(二)
我在我的个人博客上发表了第二篇解析文章.欢迎各位读者批评指正. Cwinux源码解析(二)
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- Spring事务源码解析(二)获取增强
在上一篇文章@EnableTransactionManagement注解解析中,我们搭建了源码阅读的环境,以及解析了开启Spring事务功能的注解@EnableTransactionManagemen ...
- Netty 源码解析(二):Netty 的 Channel
本文首发于微信公众号[猿灯塔],转载引用请说明出处 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty源码解析(一):开始 当前:Netty 源码解析(二): Netty 的 Channel ...
- AOP源码解析之二-创建AOP代理前传,获取AOP信息
AOP源码解析之二-创建AOP代理前传,获取AOP信息. 上篇文章对AOP的基本概念说清楚了,那么接下来的AOP还剩下两个大的步骤获取定义的AOP信息,生成代理对象扔到beanFactory中. 本篇 ...
随机推荐
- PLC编程算法
PLC编程算法(一) 01 开关量也称逻辑量,指仅有两个取值,0或1.ON或OFF.它是最常用的控制,对它进行控制是PLC的优势,也是PLC最基本的应用. 开关量控制的目的是,根据开关量的当前输入组合 ...
- java Static的使用
static是一个静态修饰符,用于修饰成员(成员变量,成员函数).<thinking in java>对staic的使用场景有下面2种定义:“一种情形是只想用一个存储区域来保存一个特定的数 ...
- Webi Report 展示 图片链接 (Image Link)
最近由于项目需求,在生成的Webi Report中需要增加一列展示相关数据系统的图片链接,要求用户可以通过点击图片链接展示图片. 方法如下: 1,首先找到系统中图片,查看随机一张图片的属性,找到图片的 ...
- FZU 2256 迷宫
https://vjudge.net/problem/FZU-2256 题意:略 思路: 在比赛的时候想到了一次dfs,一次bfs但是样例都过不了...赛后才知道,距离的更新必须同步,不能先把时光机的 ...
- 如何在Shell中快速切换目录
1.回到上一次进入的路经cd -2.回到Homecd ~3.自动补齐实例,cd /usr/src/redhat,可以用cd /u[TAB]s[TAB]r[TAB]4.!$ 表示上一个命令的最后一个参数 ...
- HDU-4787 GRE Words Revenge 解题报告
这是我之前博客里提到的一道AC自动机的练手题,但是要完成这道题,我之前博客里提到的东西还不够,这里总结一下这道题. 这道题不是一般的裸的AC自动机,它的询问和插入是交叉出现的所以用我之前写的板子不大合 ...
- 2.关于Apache Spark
关于Apache Spark 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark弹性分 ...
- Android性能测试——Allocation Tracker(Device Monitor)
Android性能测试--Allocation Tracker(Device Monitor) Allocation Tracker 能做什么? 追踪内存分配信息,按顺序排列,这样我们就能清晰看出来某 ...
- iOS字典转模型MJExtension使用
如果项目是纯OC的建议使用,MJExtension是一套字典和模型之间互相转换的超轻量级框架,可以轻松完成: 字典(JSON) --> 模型(Model) 模型(Model) --> 字典 ...
- 聪明的燕姿[JLOI2014]
题目描述 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌 ...