iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)

当我们在项目执行Carthage update获取我们的依赖framework,找到ReactiveCocoa项目文件用xcode打开,我们可以看到它对常用的UI组件做一些扩展,如打开UISearchBar文件:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第1张图片
UISearchBar.swift

可以很清楚的看到,协议转换和绑定属性的实现。ReactiveCocoa提供的组件扩展,是不可能满足我们所有的需求,比如:定义组件,第三组件等,如果这些组件也要实现这样的功能,我们应该怎么做呢?

那就需要我们自己动手来实现了!

这边,我们介绍三种,1、绑定属性,2、KVO,3、协议转换

第一:绑定属性,是最简单的,就拿上面UISearchBar来说吧,它的text属性的实现就是了,直接按它的形式依葫芦画瓢就行了。

第二:KVO,ReactiveCocoa对ios原生的KVO做了一层封装,如:object.reactive.producer(forKeyPath:"#")<最新>,object.reactive.value(forKeyPath:"#")<旧版>,它们既然都有,那么我们干嘛还用封装呢,直接用不就得了嘛?

说的没错,是可以直接用,但我觉得它还不用简洁友好,所在我们要做进一步的封装,下面我们拿WKWebView的属性扩展来做讲解。

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第2张图片
WKWebView
直接用ReactiveCocoa
用我们封装的

从上面来,显然我们自己封装的看起来,简洁友好多了,那么要怎么处理呢?

其实也不难,我们在Reactive上为WKWebView扩展一个属性,另外在ReactiveCocoa的KVO的基础上做一个Map的处理就可以了,如下:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第3张图片
WKWebView扩展

第三,协议转换,这个就稍微麻烦一点,需要动手修改ReactiveCocoa的DelegateProxy文件,由于,这个类默认是不提供给外部使用的,所有我们需要把它改为公开的,改为如下:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第4张图片
DelegateProxy
iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第5张图片
DelegateProxy extension

准备工作做好了,只用重新build(Carthage build ReactiveCocoa)一下就可以使用了。我们以WKWebView的开始加载、加载完成、加载失败的三个协议方法来做讲解。

首先,我们继承DelegateProxy写一个WKWebViewDelegateProxy类,如下:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第6张图片
WKWebViewDelegateProxy类

接着,我们实现协议转换的工作了,如下:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第7张图片
WKWebView扩展

最后,当然就是使用我们工作成果了,如下:

iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa)_第8张图片
协议转换的使用

把组件要实现的协议方法转换为可监听的Signal,是不是感觉优美了很多,嘻嘻!

三种组件的扩展方式已介绍完毕,希望对使用ReactiveCocoa的开发者有所帮助。

你可能感兴趣的:(iOS项目开发MVVM架构实践(第四篇:组件扩展-ReactiveCocoa))