我们习以为常的编码大多是通过KVO、Notification、Delegate、Block监听程序的变化,以此来达到我们想要达到的传值、改变UI等操作。现在有了
ReactiveX,它可以帮助我们让代码自动相应更新,程序可以对底层数据的变化做出响应。
以下我们谈谈
RxSwift
我们在编写
iOS程序的时候,UI便是第一步,最常用的几个控件
UILabel
Before RxSwift
// 我们要让label显示tip的文字
tip = "以往的方式"
label.text = tip
// 改变tip的值
tip = "现在的方式"
label.text = tip
After RxSwift
tip = Variable("以往的方式")
tip.asObservable()
.bind(to: label.rx.text)
.disposed(by: bag)
tip.value = "现在的方式"
UIButton
Before RxSwift
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
func buttonAction() {
...
}
After RxSwift
button.rx.tap.subscribe(onNext: {
...
})
甚至
Notification
Before RxSwift
NotificationCenter.default.addObserver(self, selector: #selector(beginEditing(_:)), name: NSNotification.Name.UITextViewTextDidBeginEditing, object: nil)
func beginEditing(_ sender: Notification) {
...
}
After RxSwift
NotificationCenter.default
.rx.notification(NSNotification.Name.UITextViewTextDidBeginEditing, object: myTextView)
.map { /*do something with data*/ }
以上便是响应式编程的优雅之处,不需要定义多余的变量方法,不需要重复的去复制操作UI变化,省去了开发过程中各种细碎的状态的维护,以往的种种烦恼在此时,便都烟消云散liao。
ReactiveX的一些重点
Observables和Observers
Observable是发生变化的对象 Observer是接收变化通知的对象
多个
Observer可以监听同一个
Observable,Observable发生变化时会通知所有订阅的
Observer。
Observable也相当于事件管道,会向订阅者发送事件信息。事件分为三种:
.Next(value) 有新的数据。 .Completed 管道已经结束。 .Error 有异常发生导致事件管道结束。
例如一个网络请求,收到服务端返回的数据后会发送
.Next,因为请求都是一次性的,所以
Next发送完后会马上发送
Completed。如果请求超时了则会发送
Error。
DisposeBag
DisposeBag是
RxSwift提供的用来管理内存的工具。
当带有
DisposeBag属性的对象调用
deinit()时,
bag将被清空,且每一个
Observer会自动取消订阅它所观察的对象。理念类似于
autoreleasepool。
如果没有
DisposeBag,则会产生
retain cycle,或者被意外释放掉,导致程序
Crash。
let _disposeBag = DisposeBag()
Observable.just("123").subscribe(onNext: { (item) in
}).addDisposableTo(_disposeBag)
Disposables.create
每个
Observable都要求
Disposable类型的返回值,通过
Disposables.create便能创建
Disposable的实例,当
Observable被释放时会执行
Disposable,相当于析构函数。
Observable.create
实际开发中用的最多的函数,创建一个
Observable。
Observable.create { (observer) -> Disposable in
...
if (error) {
observer.on(.error(RxSwiftError.unknown))
} else {
observer.on(.next(value))
observer.on(.completed)
}
return Disposables.create {
}
}
Observable.just
just只会发送一条数据,它先发送一次
.Next(value),然后发送
.Completed。
Observable.empty
empty是空管道,它只会发送
.Completed消息。
Observable.deferred
deferred会等到有
Observer的时候再去创建
Observable,相当于懒加载,而且每个订阅者订阅的对象都是内容相同但指针不同的
Observable。
Subjects
Subjet是
Observable和
Observer之间的桥梁,它既是
Obserable又是
Observer,既可以发出事件,也可以订阅事件。
PublishSubject只能收到订阅它之后的事件,订阅之前的事件无法收到。
Debug
打印所有订阅、事件、
Disposable。
sequenceThatErrors
.retry(3)
.debug()
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)