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(3)
.debug()
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)