美文网首页
RxSwift(RxCocoa)入门

RxSwift(RxCocoa)入门

作者: 红烧那个鱼丶 | 来源:发表于2017-10-28 14:12 被阅读1679次

网上许多优秀的文章已经对RxSwift进行了非常深入的介绍,特别是对事件流的解释,也非常的深入。但是就RxCocoa的基础使用上却相对较少,我写了一个小demo,使用了RxCocoa,和MVVM设计模式。
放上GitHub连接:
使用RxCocoa,遵循MVVM实现的小demo:RxSwiftPallet
下载地址:
https://github.com/HHHHex/RxSwiftPallet


*注: 使用CocoaPodsRxCocoa导入到工程时,会同时导入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

相关文章

网友评论

      本文标题:RxSwift(RxCocoa)入门

      本文链接:https://www.haomeiwen.com/subject/vxcspxtx.html