前两篇博客我们分别聊了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对象

下方是MutablePropertySignalProducer对象的简单使用示例。下方代码示例与上方的代码片段类似,输出结果也差不多,只不过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基本代码实现的更多相关文章

  1. ReactiveSwift源码解析(十) Lifetime代码实现

    为了之后博客的进行,本篇博客我们就来聊一下ReactiveSwift框架中的Lifetime类的具体实现.从Lifetime这个名字中我们就这道,就是生命周期.在ReactiveSwift中使用Lif ...

  2. ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

  3. ReactiveSwift源码解析(三) Signal代码的基本实现

    上篇博客我们详细的聊了ReactiveSwift源码中的Bag容器,详情请参见<ReactiveSwift源码解析之Bag容器>.本篇博客我们就来聊一下信号量,也就是Signal的的几种状 ...

  4. Cwinux源码解析(二)

    我在我的个人博客上发表了第二篇解析文章.欢迎各位读者批评指正. Cwinux源码解析(二)

  5. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  6. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  7. Spring事务源码解析(二)获取增强

    在上一篇文章@EnableTransactionManagement注解解析中,我们搭建了源码阅读的环境,以及解析了开启Spring事务功能的注解@EnableTransactionManagemen ...

  8. Netty 源码解析(二):Netty 的 Channel

    本文首发于微信公众号[猿灯塔],转载引用请说明出处 接下来的时间灯塔君持续更新Netty系列一共九篇 Netty源码解析(一):开始 当前:Netty 源码解析(二): Netty 的 Channel ...

  9. AOP源码解析之二-创建AOP代理前传,获取AOP信息

    AOP源码解析之二-创建AOP代理前传,获取AOP信息. 上篇文章对AOP的基本概念说清楚了,那么接下来的AOP还剩下两个大的步骤获取定义的AOP信息,生成代理对象扔到beanFactory中. 本篇 ...

随机推荐

  1. mysql获得自增的下条id的值

    需求: 当数据表中存在一个字段需要该条数据中自增长的id值 实现方法:(1)代码中先插入该条数据后,再次修改数据 (2)在数据库中使用触发器完成 具体实现:实现方法中的第一种方法就不在此实现,以下便是 ...

  2. 关于github 0.6.2版本的使用方法

    貌似做为一名前端开发人员,没听过使用过github,node,vue就像落伍一样,本人也是在前端自摸自爬的路上越走越远了,经常在群里听大神们讨论vue,github,node,好生羡慕,没人教,没人带 ...

  3. Oozie时bin/oozied.sh start或bin/oozied.sh run出现Bootstrap进程无法启动,http://bigdatamaster:11000/oozie界面也无法打开?E0103: Could not load service classes, java.lang.ClassNotFoundException: Class org.apache.oozie.ser

    不多说,直接上干货! 问题详情 [hadoop@bigdatamaster oozie--cdh5.5.4]$ bin/oozied.sh start Setting OOZIE_HOME: /hom ...

  4. Memcached的基础梳理

    1 .Memcached 概念 官方解释如下: What is Memcached? Free & open source, high-performance, distributed mem ...

  5. Mybatis Dynamic Query 框架整合

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  6. Android studio java.lang.UnsatisfiedLinkError

    最近开始转android Studio 本来以为新的开发工具会大大的提高效率 .结果我错了.今天踩了一天的坑. 我的项目中用到了so的文件.通常情况下在 eclipse中我们在libs/armeabi ...

  7. strcpy.strcmp.strlen.strcat函数的实现

    #include <stdio.h> #include <string.h>   char *copy(char *a,char *b);//声明一个复制函数 char *ca ...

  8. 让你的Dapper像EF一样调用 开源~!

    什么是Dapper? Dapper是一款轻量级的ORM框架,大名鼎鼎! 由谷歌Google 开发,在N款orm框架中 效率是最快的 最高的! 经过数据测试 比EF快 12-20 倍 国外最大的技术网站 ...

  9. 一个普通的 Zepto 源码分析(二) - ajax 模块

    一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...

  10. [学习笔记] 多项式与快速傅里叶变换(FFT)基础

    引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积, 而代码量却非常小. 博主一年半前曾经因COGS的一 ...