Subjects 介紹
1. Subjects 是訂閱者,也是Observable
訂閱者:它能動態的接收新的值。
Observable: 當Subjects有了新值后會通過Event將新值發出給他的所有訂閱者。
2. 常用的方法
- onNext(:):是on(.next(:)) 的簡便寫法。該方法相當于 subject 接收到一個.next 事件。
- onError(:):是on(.error(:))的簡便寫法。該方法相當于 subject 接收到一個.error 事件。
- onCompleted():是 on(.completed)的簡便寫法。該方法相當于 subject 接收到一個 .completed事件。
3. Subjects 有四種PublishSubject、BehaviorSubject、ReplaySubject、Variable
相同點
- 都是Observable,他們的訂閱者都能接收他們發出的新的Event
- 直到 Subject 發出 .complete 或者 .error 的 Event 后,該 Subject 便終結了,同時它也就不會再發出.next事件。
- 對于那些在Subject 終結后再訂閱他的訂閱者,也能收到 subject發出的一條.complete 或.error的event,告訴這個新的訂閱者它已經終結了。
不同點
- PublishSubject
- 最普通的Subject,不需要初始值就能初始化。
- 他的訂閱者只能收到他們訂閱后的 Event。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
let sub = PublishSubject<String>() sub.onNext( "訂閱之前的不能接收到" ) sub.subscribe { event in print(event.element) //Optional("訂閱之后的可以接收到") //nil }.disposed(by: disposeBag) sub.onNext( "訂閱之后的可以接收到" ) //結束 sub.onCompleted() /// 結束之后添加的訂閱能收到 completed sub.subscribe { event in print(event) } sub.onNext( "結束后發的都收不到" ) |
BehaviorSubject
需要一個默認值初始化
當一個訂閱者訂閱之后會立馬收到上一個Event,之后就是正常情況發一個收一個。
onCompleted()之后的訂閱者也只能收到Completed。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
let sub = BehaviorSubject(value: "默認值" ) sub.subscribe { event in print( "訂閱1" , event) }.disposed(by: disposeBag) sub.subscribe { event in print( "訂閱2" , event) }.disposed(by: disposeBag) sub.onCompleted() sub.subscribe { event in print( "訂閱3" , event) }.disposed(by: disposeBag) 訂閱 1 next(默認值) 訂閱 1 next(發送 1 ) 訂閱 2 next(發送 1 ) 訂閱 1 completed 訂閱 2 completed 訂閱 3 completed |
ReplaySubject
創建的時候需要一個參數bufferSize設置記錄個數
新添加的訂閱會接收到之前發送的兩個 Event,如果不足兩個就只接收一個。
如果超過兩個只接收最新的兩個。
如果訂閱時已經結束除了會接收到最新的兩個Event外還有結束的complete或error。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
let sub = ReplaySubject<String>.create(bufferSize: 2 ) sub.subscribe { event in print( "訂閱1" , event) }.disposed(by: disposeBag) sub.onNext( "發送1" ) print( "-------" ) sub.subscribe { event in print( "訂閱2" , event) }.disposed(by: disposeBag) sub.onNext( "發送2" ) sub.onNext( "發送3" ) sub.onNext( "發送4" ) print( "-------" ) sub.subscribe { event in print( "訂閱3" , event) }.disposed(by: disposeBag) sub.onCompleted() print( "-------" ) /// 不僅會收到最后的兩個 event 還有 Completed sub.subscribe { event in print( "訂閱4" , event) } 訂閱 1 next(發送 1 ) ------- 訂閱 2 next(發送 1 ) 訂閱 1 next(發送 2 ) 訂閱 2 next(發送 2 ) 訂閱 1 next(發送 3 ) 訂閱 2 next(發送 3 ) 訂閱 1 next(發送 4 ) 訂閱 2 next(發送 4 ) ------- 訂閱 3 next(發送 3 ) 訂閱 3 next(發送 4 ) 訂閱 1 completed 訂閱 2 completed 訂閱 3 completed ------- 訂閱 4 next(發送 3 ) 訂閱 4 next(發送 4 ) 訂閱 4 completed |
BehaviorRelay
基本同 BehaviorSubject功能一樣,但是不能主動調用onCompleted和error,會在BehaviorRelay釋放前調用
1
2
3
4
5
6
7
8
9
|
let sub = BehaviorRelay(value: "初始值" ) sub.subscribe { event in print( "第一次訂閱" , event) }.disposed(by: disposeBag) sub.accept( "新值1" ) sub.subscribe { event in print( "第二次訂閱" , event) }.disposed(by: disposeBag) |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://www.cnblogs.com/i2yf/p/14016617.html