ReactiveX 的不同之处
我们习以为常的编码大多是通过
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<String>("以往的方式")
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()
.debug()
.subscribe(onNext: { print($) })
.addDisposableTo(disposeBag)