zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

iOS - RxSwift - Subject

ios
2023-09-27 14:25:58 时间
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 里的 MVVM 和 RxSwift 在本文中,我将介绍 iOS 编程中的 MVVM 设计模式以及 RxSwift。本文分为两部分,第一部分简要介绍了设计模式和 RxSwift 的基础知识,而在 第二部分 里,有一个实现了 MVVM 和 RxSwift 的示例项目。