MyException - 我的异常网
当前位置:我的异常网» Swift » ReactiveSwift源码解析(十二) MutableProperty根本

ReactiveSwift源码解析(十二) MutableProperty根本代码实现

www.MyException.Cn  网友分享于:2013-09-03  浏览:0次
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对象

下方是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 

 

文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
中美印日四国程序员比较
中美印日四国程序员比较
为什么程序员都是夜猫子
为什么程序员都是夜猫子
每天工作4小时的程序员
每天工作4小时的程序员
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我的丈夫是个程序员
我的丈夫是个程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
代码女神横空出世
代码女神横空出世
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个调试和排错的小建议
10个调试和排错的小建议
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
Java程序员必看电影
Java程序员必看电影
漫画:程序员的工作
漫画:程序员的工作
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的鄙视链
程序员的鄙视链
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员都该阅读的书
程序员都该阅读的书
 程序员的样子
程序员的样子
总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员必看的十大电影
程序员必看的十大电影
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员和编码员之间的区别
程序员和编码员之间的区别
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
编程语言是女人
编程语言是女人
一个程序员的时间管理
一个程序员的时间管理
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
老程序员的下场
老程序员的下场
我是如何打败拖延症的
我是如何打败拖延症的
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
旅行,写作,编程
旅行,写作,编程
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有