网上许多优秀的文章已经对RxSwift
进行了非常深入的介绍,特别是对事件流的解释,也非常的深入。但是就RxCocoa
的基础使用上却相对较少,我写了一个小demo,使用了RxCocoa
,和MVVM设计模式。
放上GitHub连接:
使用RxCocoa,遵循MVVM实现的小demo:RxSwiftPallet
下载地址:
https://github.com/HHHHex/RxSwiftPallet
*注: 使用CocoaPods
将RxCocoa
导入到工程时,会同时导入RxSwift
RxSwift中的几个入门概念及理解
Variable
可变值、Observable
可观察对象、func bind(to: _) -> _
绑定(合并)、func subscribe((_)->())-> _
订阅
如果将数据流比作水的话,Variable
就是水流。
Variable
的初始化:
let r_value = Variable<UInt>(0)
或者
let r_value = Variable<String>("")
等等...很多基础数据类型都可以这样完成初始化工作。
我们的目的是要对水流(也就是数据变化)实现观察,所以
我们将水流装进水箱Observable
以便于将来规定水流的流向、过滤,等问题。
Observable
将水流装进水箱:
let r_obser: Observable<UInt>
// r_value 就是上文中的那个 r_value
r_obser = r_value.asObservable()
以上是基本操作,所有操作基本上是以以上操作作为开始,不管是将来对观察对象予以绑定,观察数据予以过滤、订阅。
现在数据都被处理进了水箱中数据就像瓮中之鳖一样,它们等待着我们去观察:
给水箱装上水龙头func subscribe((_)->())-> _
r_obser.subscribe { (event) in
//在这里处理数据
}
关于闭包中的event
参数:传递进来的事件这里不做详细介绍,如果需要取改变的数据:
b_obser.subscribe { (event) in
// event.element 就是r_value 改变的 newValue 了
guard let value = event.element else { return }
}
通过‘订阅’这种方式,每次r_value
被改变,我们就能从闭包中接收到r_value
的新值。
现在我们眼前有个水箱Observable
,屋子里也有个水箱,但是我想看屋子里水箱的值,怎么办呢
通过管道func bind(to: _) -> _
将两个水箱连接:
viewModel.r_obser
.bind(to: /**屋里的水箱*/)
这样不管是屋里的水箱还是眼前的水箱有水在流动,我都可以在水龙头subscribe
得到反馈
但是屋里的水箱和眼前的水箱装的东西不一样啊,一个是水,一个是油(一个是Int
,一个是String
)
那就在绑定之前先转换.map { Int($0) }
viewModel.r_obser
.map { Int($0) }
.bind(to: /**屋里的水箱*/)
func map{(Any)-> () }
方法的用法:
CocoaChina: Swift高阶函数:Map,Filter,Reduce
http://www.cocoachina.com/swift/20150619/12173.html
在我们对水箱进行观察之后,我们需要对水箱进行释放,就像MRC时代的引用释放一样。一般使用方法是将Observable()
放到DisposeBag()
中让其自行管理释放时机,原理可以类比Objectice-C
中的@autoreleasepool
。
let disposeBag = DisposeBag()
viewModel.r_obser
.map { Float($0) }
.bind(to: localView.r_slider.rx.value)
.addDisposableTo(disposeBag)
RxCocoa
RxCocoa已经将UIKit中很多视图控件的很多属性值封装成了Observable
,他们就是上文说到的‘屋里的水箱’,我们可以通过将他们与我们的水箱进行绑定来观察他们,也可以直接对他们进行观察,或者我们可以将两个空间相互绑定实现控件间的联动。
举个🌰:
let slider = UISlider()
let slider2 = UISlider()
slider.rx.value
.bind(to: slider2.rx.value)
.addDisposableTo(disposeBag)
附上链接,在这里可以查到RxSwift的API以及RxCocoa对UIKit控件的扩展方法
http://blog.csdn.net/yangmeng13930719363/article/details/51905739
有了这些我们就能做一个简单的demo,就是文章开头的demo
使用RxCocoa,遵循MVVM实现的小demo:RxSwiftPallet
下载地址:
https://github.com/HHHHex/RxSwiftPallet
网友评论