RxSwift 3.Subject(Observable & Observer)

文章目录
  1. 1. AsyncSubject
  2. 2. PublishSubject
  3. 3. ReplaySubject
  4. 4. BehaviorSubject
  5. 5. Variable(弃用)
  6. 6. Relay
    1. 6.1. PublishRelay
    2. 6.2. BehaviorRelay
subject

首先在开发的时候思考,他是一个 Observable

AsyncSubject

  1. 特点:
    • 当 Observable Sequence 发送 complete 事件,AsyncSubject 才会发送最后一个 next 事件和 complete
    • 当 Observable Sequence 发送 error 事件,AsyncSubject 只发送 error 事件,不会发送最后一个 next
2. 演示
1
2
3
4
5
6
7
8
9
let disposeBag = DisposeBag() 
let subject = AsyncSubject<String>()
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext(" ")
subject.onNext(" ")
subject.onNext(" ")
subject.onCompleted()

输出结果:

1
2
Subscription: 1 Event: next(ί )
Subscription: 1 Event: completed

PublishSubject

  1. 特点:
    • PublishSubject 发送订阅后产⽣的元素.
    • PublishSubject 不发送订阅前产⽣的元素.
publicSubject
2. 演示
1
2
3
4
5
6
7
8
9
10
11
12
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext(" ")
subject.onNext(" ")
subject
.subscribe { print("Subscription: 2 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("A ")
subject.onNext("B ")
1
2
3
4
5
6
Subscription: 1 Event: next(  )
Subscription: 1 Event: next( )
Subscription: 1 Event: next(A )
Subscription: 2 Event: next(A )
Subscription: 1 Event: next(B )
Subscription: 2 Event: next(B )

ReplaySubject

  1. 特点:
    • ReplaySubject 将对观察者发送全部的元素,⽆论观察者是何时进⾏订阅的。
replaySubject
2. 演示
1
2
3
4
5
6
7
8
9
10
11
12
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 1)
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext(" ")
subject.onNext(" ")
subject
.subscribe { print("Subscription: 2 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext("A ")
subject.onNext("B ")
1
2
3
4
5
6
7
Subscription: 1 Event: next(  ) 
Subscription: 1 Event: next( )
Subscription: 2 Event: next( )
Subscription: 1 Event: next(A )
Subscription: 2 Event: next(A )
Subscription: 1 Event: next(B )
Subscription: 2 Event: next(B )

BehaviorSubject

  1. 特点:
    1. 具有默认值
    2. 当订阅 BehaviorSubject 时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产⽣的元素发送出来。
    3. 如果 Observable 发 error 事件,那么BehaviorSubject不会再发送 next 事件,而只是传递来自源 Observable 的 error 事件。

normal

behaviorSubject1

error

behaviorSubject2
2. 演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: " ")
subject
.subscribe { print("Subscription: 1 Event:", $0) }
.disposed(by: disposeBag)

subject.onNext(" ")
subject.onNext(" ")
subject
.subscribe { print("Subscription: 2 Event:", $0) }
.disposed(by: disposeBag)

subject.onNext("A ")
subject.onNext("B ")
subject
.subscribe { print("Subscription: 3 Event:", $0) }
.disposed(by: disposeBag)
subject.onNext(" ")
subject.onNext(" ")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Subscription: 1 Event: next(  )
Subscription: 1 Event: next( )
Subscription: 1 Event: next( )
Subscription: 2 Event: next( )
Subscription: 1 Event: next(A )
Subscription: 2 Event: next(A )
Subscription: 1 Event: next(B )
Subscription: 2 Event: next(B )
Subscription: 3 Event: next(B )
Subscription: 1 Event: next( )
Subscription: 2 Event: next( )
Subscription: 3 Event: next( )
Subscription: 1 Event: next( )
Subscription: 2 Event: next( )
Subscription: 3 Event: next( )

Variable(弃用)

在 RxSwift 5.x 中,他被官⽅的正式的弃⽤了,并且在需要时,推荐使⽤ BehaviorRelay 或者 BehaviorSubject。

Relay

RxRelay

RxRelay提供两种中继:PublishRelay 和 BehaviorRelay。它们的行为与对应的 Subjects 完全相同,但有两个变化:

  • Relays never complete.
  • Relays never emit errors.

本质上,中继仅发出.next事件,并且永不终止,有了他,我们将 API 转化为 Rx 样式时,就不必担⼼⼀个意外的终⽌事件,导致后续事件转发失效。

PublishRelay

PublishRelay 就是 PublishSubject 去掉终⽌事件 onError 和 onCompleted。

示例:

1
2
3
4
5
6
7
8
9
10
11
let disposeBag = DisposeBag() 
let relay = PublishRelay<String>()
relay
.subscribe { print("Event:", $0) }
.disposed(by: disposeBag)
relay.accept(" ")
relay.accept(" ")

// output
Event: next( )
Event: next( )

BehaviorRelay

BehaviorRelay 就是 BehaviorSubject 去掉终⽌事件 onError 和 onCompleted。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
let disposeBag = DisposeBag() 
let relay = BehaviorRelay(value: " ")
relay
.subscribe { print("Event:", $0) }
.disposed(by: disposeBag)
relay.accept(" ")
relay.accept(" ")

// output
Event: next( )
Event: next( )
Event: next( )