🐻RxSwift(一)Observable 与 监控式编程

1,349 阅读3分钟

世界是物质的,物质是运动的,运动是有规律的,规律是可以被人类认识的,为何不把软件开发中的运动,归结于数据?

为什么叫监控式编程

监控式编程是我觉得用来介绍 Observable最好的词汇。这对理解RxSwift至关重要。

App开发,一定是数据驱动界面,而数据来源大致可以分为:网络、本地、屏幕、按钮、摄像头。

如果我们能观察数据变化,把所有的可能会对界面变化产生影响的数据都监控起来,那么就根据数据驱动界面。

这样就由命令式编程转变为了监控式编程。

在Rx的世界里,万物(数据源)皆为可监控对象。

Observable 会分发出一组数据

大部分情况下,数据源会源源不断的产生新的数据,我们根据新的数据做相应的调整(当然有时也需要旧的数据,这个先不讨论)。

创建一个可监控对象的方法有很多,不过多赘述。

我们只看一个,这也是我们用的最多,最难的一种方式:

Observable.create

示例:

Observable<String>.create { observer in
    observer.onNext("1")
    return Disposables.create()
}

Observable<泛型>.create。泛型取决于监控对象能发出来类型,这里是String,对于网络请求,可能就是JSON 字典。

Observable 更多机制

大部分被监控对象 为了更好的被监控,还提供了更多机制,比如:

  • 1、数据发送完毕
  • 2、数据异常、出错
  • 3、生命周期

数据发送完毕时: observer.onCompleted() 发出完毕后,被监控对象自动结束生命

数据异常时: observer.onError(error) 发出数据异常后,被监控对象自动结束生命

生命周期: 如果外界不想监控了,可以把被监控对象结束掉,没有人监控时,被监控对象是不工作的。

所有代码如下:

  let disposeBag = DisposeBag()
  
  Observable<String>.create { observer in
    observer.onNext("1")
    observer.onError(error)
    observer.onCompleted()
    return Disposables.create()
  }
  .subscribe(
    onNext: { print($0) },
    onError: { print($0) },
    onCompleted: { print("Completed") },
    onDisposed: { print("Disposed") }
  ).disposed(by: disposeBag)
}

并不是所有的被监控对象都提供这样的机制,总有这样那样的需求,需要被监控对象提供不同的机制。

官方为我们提供了以下几种:

  • Singles 只会发出一个数据,然后就结束,并且数据 只有 success(value) 或者 error(error)
  • Completable 只会发出一个数据,然后就结束,并且数据 只有 completed or error(error)
  • Maybe 只会发出一个数据,然后就结束,success(value) 或者 completed or error(error)

以上三种都有对应场景。等以后介绍。

Single 与网络请求

网络请求的结果就是成功和失败,是否可以通过Single来创建关于网络请求的可被监控对象呢?

比如这样:

        let observable: Single<[String: Any]> = Single.create { observable in
            ...
            ///
            observable.success(x)
            ...
            ///
            observable.error(x)

            return Disposables.create()
        }

答案是否定的。因为有一种case可能无法满足,即:接口数据缓存。因为一旦发出success之后Single对象会自我结束。

小结

  • 为什么叫监控式编程?
  • 如何创建一个Observable?
  • Observable 的类型以及特性