美文网首页
iOS - RxSwift - Subject

iOS - RxSwift - Subject

作者: 码代码的小马 | 来源:发表于2021-05-21 13:02 被阅读0次

    参考

    RxSwift中文文档

    Github RxSwift

    1. AsyncSubject

    AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。

    它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。

        /*
         AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。
    
         它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
         */
        func setupAsyncSubject() {
            let subject = AsyncSubject<String>()
            subject
                .subscribe {
                    print("AsyncSubject  1 Event :",$0)
                }
                .disposed(by: disposeBag)
            
            subject.onNext("🐶")
            subject.onNext("🐥")
            subject.onNext("🐍")
            subject.onNext("🐯")
            subject.onCompleted()
        }
    

    输出:

    AsyncSubject  1 Event : next(🐯)
    AsyncSubject  1 Event : completed
    

    2. PublishSubject

    PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。

    如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。

        /*
         PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。如果你希望观察者接收到所有的元素,你可以通过使用 Observable 的 create 方法来创建 Observable,或者使用 ReplaySubject。
    
         如果源 Observable 因为产生了一个 error 事件而中止, PublishSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
         */
        func setupPublishSubject() {
            let subject = PublishSubject<String>()
            subject
                .subscribe {print("PublishSubject  1 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🐶")
            subject.onNext("🐥")
            subject
                .subscribe {print("PublishSubject  2 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🐍")
            subject.onNext("🐯")
            subject.onCompleted()
        }
    

    输出:

    PublishSubject  1 Event:  next(🐶)
    PublishSubject  1 Event:  next(🐥)
    PublishSubject  1 Event:  next(🐍)
    PublishSubject  2 Event:  next(🐍)
    PublishSubject  1 Event:  next(🐯)
    PublishSubject  2 Event:  next(🐯)
    PublishSubject  1 Event:  completed
    PublishSubject  2 Event:  completed
    

    3. ReplaySubject

    ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。

    这里存在多个版本的 ReplaySubject,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。

    如果把 ReplaySubject 当作观察者来使用,注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用,将造成意想不到的结果。

        /*
         ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。
    
         这里存在多个版本的 ReplaySubject,有的只会将最新的 n 个元素发送给观察者,有的只会将限制时间段内最新的元素发送给观察者。
    
         如果把 ReplaySubject 当作观察者来使用,注意不要在多个线程调用 onNext, onError 或 onCompleted。这样会导致无序调用,将造成意想不到的结果。
         */
        func setupReplaySubject() {
            /// Creates new instance of `ReplaySubject` that replays at most `bufferSize` last elements of sequence.
            ///
            /// - parameter bufferSize: Maximal number of elements to replay to observer after subscription.
            /// - returns: New instance of replay subject.
            let subject = ReplaySubject<String>.create(bufferSize: 1)
            
            subject
                .subscribe{print("ReplaySubject  1 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🐶")
            subject.onNext("🐥")
            
            subject
                .subscribe{ print("ReplaySubject  2 Event: ", $0)}
                .disposed(by: disposeBag)
            subject.onNext("🐍")
            subject.onNext("🐯")
        }
    

    输出:

    ReplaySubject  1 Event:  next(🐶)
    ReplaySubject  1 Event:  next(🐥)
    ReplaySubject  2 Event:  next(🐥)
    ReplaySubject  1 Event:  next(🐍)
    ReplaySubject  2 Event:  next(🐍)
    ReplaySubject  1 Event:  next(🐯)
    ReplaySubject  2 Event:  next(🐯)
    
    

    4. BehaviorSubject

        /*
         当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。
         如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
         */
        func setupBehavioreSubject() {
            let subject = BehaviorSubject(value: "🏀")
            subject
                .subscribe{ print("BehaviorSubject 1 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🐶")
            subject.onNext("🐥")
            
            subject
                .subscribe{ print("BehaviorSubject 2 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🅰️")
            subject.onNext("🅱️")
            
            subject
                .subscribe{ print("BehaviorSubject 3 Event: ", $0)}
                .disposed(by: disposeBag)
            
            subject.onNext("🍎")
            subject.onNext("🍐")
        }
    

    输出:

    BehaviorSubject 1 Event:  next(🏀)
    BehaviorSubject 1 Event:  next(🐶)
    BehaviorSubject 1 Event:  next(🐥)
    BehaviorSubject 2 Event:  next(🐥)
    BehaviorSubject 1 Event:  next(🅰️)
    BehaviorSubject 2 Event:  next(🅰️)
    BehaviorSubject 1 Event:  next(🅱️)
    BehaviorSubject 2 Event:  next(🅱️)
    BehaviorSubject 3 Event:  next(🅱️)
    BehaviorSubject 1 Event:  next(🍎)
    BehaviorSubject 2 Event:  next(🍎)
    BehaviorSubject 3 Event:  next(🍎)
    BehaviorSubject 1 Event:  next(🍐)
    BehaviorSubject 2 Event:  next(🍐)
    BehaviorSubject 3 Event:  next(🍐)
    

    相关文章

      网友评论

          本文标题:iOS - RxSwift - Subject

          本文链接:https://www.haomeiwen.com/subject/jdoidltx.html