iOS开发iOS学习开发程序员

RxSwift之Observable

2019-09-26  本文已影响0人  __Mr_Xie__

概念

Observable 这个类是 Rx 框架的核心,我们可以称它为可观察序列,也可称它为可被监听的序列。
Rx 响应的是流(Stream),在 RxSwift 中,我们称之为 序列(sequence), 事实上,在这里 流 和 序列 是同一样东西。

Observable 的作用就是可以异步地产生一系列的 Event(事件),即一个 Observable<T> 对象会随着时间推移不定期地发出 event(element : T) 这样一个东西。
而且这些 Event 还可以携带数据,它的泛型 <T> 就是用来指定这个 Event 携带的数据的类型。

有了可观察序列,我们还需要有一个 Observer(订阅者)来订阅它,这样这个订阅者才能收到 Observable<T> 不时发出的 Event

Observable 的生命周期

说到 Observable 的生命周期,我们先介绍一下 event(事件)吧。

public enum Event<Element> {
    case next(Element)
    case error(Swift.Error)
    case completed
}

官方文档如下:

翻译:next 事件就是那个可以携带数据 <T> 的事件,可以说它就是一个“最正常”的事件。

翻译:error 事件表示一个错误,它可以携带具体的错误内容,一旦 Observable 发出了 error event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。

翻译:completed 事件表示 Observable 发出的事件正常地结束了,跟 error 一样,一旦 Observable 发出了 completed event,则这个 Observable 就等于终止了,以后它再也不会发出 event 事件了。

你可以合理的利用这些 Event 来实现业务逻辑。了解 Event 之后, Observable 的生命周期就很好理解了:

创建Observable

可以通过以下方法创建 Observable

func test() {
        let disposeBag = DisposeBag()
        
        let justObservable = Observable.just("100")
        
        justObservable.subscribe(onNext: { (event) in
            print("onNext: \(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onNext: 100
onCompleted
func test() {
        let disposeBag = DisposeBag()
        
        let ofObservable = Observable.of("a", "b", "c")
        
        ofObservable.subscribe(onNext: { (event) in
            print("onNext: \(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onNext: a
onNext: b
onNext: c
onCompleted
func test() {
        let disposeBag = DisposeBag()
        
        let fromObservable = Observable.from(["f", "r", "o", "m"])
        
        fromObservable.subscribe(onNext: { (event) in
            print("onNext: \(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onNext: f
onNext: r
onNext: o
onNext: m
onCompleted
func test() {
        let disposeBag = DisposeBag()
        
        let rangeObservable = Observable.range(start: 0, count: 10)
        
        rangeObservable.subscribe(onNext: { (event) in
            print("onNext: \(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onNext: 0
onNext: 1
onNext: 2
onNext: 3
onNext: 4
onNext: 5
onNext: 6
onNext: 7
onNext: 8
onNext: 9
onCompleted
enum MyError: Error {
    case A
    case B
    var errorType: String {
        switch self {
        case .A:
            return "I am error A"
        case .B:
            return "I am error B"
        }
    }
}
func test() {
        let disposeBag = DisposeBag()
        
        let myError = MyError.A
        
        let errorObservable = Observable<Int>.error(myError)
        errorObservable.subscribe(onNext: { (event) in
            print("onNext:\(event)")
        }, onError: { (error) in
            print("onError:\((error as! MyError).errorType)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onError:I am error A
let observable = Observable<Void>.empty()
let observable = Observable<Any>.never()
func test() {
        let disposeBag = DisposeBag()
        
        let repeatElementObservable = Observable.repeatElement("repeat")
        
        repeatElementObservable.subscribe(onNext: { (event) in
            print("onNext:\(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
}

打印结果:

onNext:repeat
onNext:repeat
onNext:repeat
...
func test() {
        let disposeBag = DisposeBag()
        
        let obj = Observable<Any>.create { observer -> Disposable in
            observer.onNext(0)
            observer.onNext(1)
            observer.onNext(2)
            observer.onNext(3)
            observer.onNext(4)
            observer.onCompleted()
            observer.onNext(5)
            observer.onError(MyError.A)
            
            return Disposables.create()
        }
        
        obj.subscribe(onNext: { (element) in
            print(element)
        }, onError: { (error) in
            print(error)
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
    }

打印结果:

0
1
2
3
4
onCompleted
func test() {
        let disposeBag = DisposeBag()
        
        var isOdd = true
        let factory = Observable<Int>.deferred { () -> Observable<Int> in
            isOdd = !isOdd
            if isOdd {
                return Observable.of(0,2,4,6)
            } else {
                return Observable.of(1,3,5,7)
            }
        }
        
        factory.subscribe(onNext: { (event) in
            print("onNext:\(event)")
        }, onCompleted: {
            print("onCompleted")
        }).disposed(by: disposeBag)
    }

打印结果:

onNext:1
onNext:3
onNext:5
onNext:7
onCompleted
func test() {
        let disposeBag = DisposeBag()
        let generateSequence = Observable<Int>.generate(
            initialState: 0,
            condition: {$0 < 5},
            iterate: {$0 + 1}
        )
        
        generateSequence.subscribe { event in
            print(event)
        }).disposed(by: disposeBag)
    }

打印结果:

next(0)
next(1)
next(2)
next(3)
next(4)
completed
'interval(_:scheduler:)' is deprecated: Use DispatchTimeInterval overload instead.
'timer(_:period:scheduler:)' is deprecated: Use DispatchTimeInterval overload instead.

Author

如果你有什么建议,可以关注我的公众号:iOS开发者进阶,直接留言,留言必回。

上一篇 下一篇

猜你喜欢

热点阅读