世界是物质的,物质是运动的,运动是有规律的,规律是可以被人类认识的,为何不把软件开发中的运动,归结于数据?
为什么叫监控式编程
监控式编程是我觉得用来介绍 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 的类型以及特性