天天看点

ReactiveX/RxSwift 初见

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)