RxSwift (二) Working with Subjects

首先在playground 中给ObervableType增加一个扩展。方便查看子类订阅时发生的变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extension ObservableType{
///给每一个观察者增加一个id。并打印id和发射的事件
func addObservable(_ id:String) -> Disposable {
return subscribe{
print("Subscription:", id, "Event:", $0)
}
}
}
func writeSequenceToConsole<O: ObservableType>(name: String, sequence: O) -> Disposable {
return sequence.subscribe { event in
print("Subscription: \(name), event: \(event)")
}
}

PublishSubject

PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
exampleOf(description: "PublishSubject") {
let disposeBag = DisposeBag()
let publishSubject = PublishSubject<String>()
///第一组
publishSubject.addObservable("no.1").disposed(by: disposeBag)
publishSubject.onNext("2")
publishSubject.onNext("3")
//第二组
publishSubject.addObservable("no.2").disposed(by: disposeBag)
publishSubject.onNext("🐱")
publishSubject.onNext("🐶")
}

打印结果如下

1
2
3
4
5
6
7
------exampleOf:PublishSubject------
Subscription: no.1 Event: next(2)
Subscription: no.1 Event: next(3)
Subscription: no.1 Event: next(🐱)
Subscription: no.2 Event: next(🐱)
Subscription: no.1 Event: next(🐶)
Subscription: no.2 Event: next(🐶)

可以看no.2 并没有收到no.2订阅之前发送的信号(2和3)。

ReplaySubject

ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。也 有其它版本的ReplaySubject,在重放缓存增长到一定大小的时候或过了一段时间后会丢弃旧 的数据(原始Observable发射的)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
exampleOf(description: "replaySubject") {
let disposeBag = DisposeBag()
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
replaySubject.addObservable("no.1").disposed(by: disposeBag)
replaySubject.onNext("第一个事件")
replaySubject.onNext("第二个事件")
replaySubject.addObservable("no.2").disposed(by: disposeBag)
replaySubject.onNext("3")
replaySubject.onNext("4")
}

打印结果如下

1
2
3
4
5
6
7
8
9
------exampleOf:replaySubject------
Subscription: no.1 Event: next(第一个事件)
Subscription: no.1 Event: next(第二个事件)
Subscription: no.2 Event: next(第一个事件)
Subscription: no.2 Event: next(第二个事件)
Subscription: no.1 Event: next(3)
Subscription: no.2 Event: next(3)
Subscription: no.1 Event: next(4)
Subscription: no.2 Event: next(4)

会将订阅之前的信号发给新订阅者。如果指定了buttersize,会根据buttersize(我理解为多少个)发送之前的数据

BehaviorSubject

当观察者订阅BehaviorSubject时,它开始发射原始Observable最近发射的数据(如果此时还 没有收到任何数据,它会发射一个默认值),然后继续发射其它任何来自原始Observable的 数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
exampleOf(description: "BehaviorSubject") {
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "behavior")
subject.addObservable("第一个响应").disposed(by: disposeBag)
subject.onNext("第一个事件")
subject.onNext("第二个事件")
subject.addObservable("第二个响应").disposed(by: disposeBag)
subject.onNext("第三个事件")
subject.onNext("第四个事件")
}

打印结果

1
2
3
4
5
6
7
8
9
------exampleOf:BehaviorSubject------
Subscription: 第一个响应 Event: next(behavior)
Subscription: 第一个响应 Event: next(第一个事件)
Subscription: 第一个响应 Event: next(第二个事件)
Subscription: 第二个响应 Event: next(第二个事件)
Subscription: 第一个响应 Event: next(第三个事件)
Subscription: 第二个响应 Event: next(第三个事件)
Subscription: 第一个响应 Event: next(第四个事件)
Subscription: 第二个响应 Event: next(第四个事件)

Variable

Variable是BehaviorSubject的一层封装。特点不会被显式终结。即:不会收到 .Completed 和 .Error 这类的终结事件,它会主动在析构的时候发送 .Complete 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
exampleOf(description: "Variable") {
let disposeBag = DisposeBag()
let variable = Variable<String>("默认值")
variable.asObservable().addObservable("no.1").disposed(by: disposeBag)
variable.value = "第二个值"
variable.value = "第三个值"
variable.asObservable().addObservable("no.2").disposed(by: disposeBag)
variable.value = "第四个值"
variable.value = "第五个值"
}

打印结果

1
2
3
4
5
6
7
8
9
10
11
------exampleOf:Variable------
Subscription: no.1 Event: next(默认值)
Subscription: no.1 Event: next(第二个值)
Subscription: no.1 Event: next(第三个值)
Subscription: no.2 Event: next(第三个值)
Subscription: no.1 Event: next(第四个值)
Subscription: no.2 Event: next(第四个值)
Subscription: no.1 Event: next(第五个值)
Subscription: no.2 Event: next(第五个值)
Subscription: no.1 Event: completed
Subscription: no.2 Event: completed