什么是Subjects
Subjet是observable和Observer之間的橋梁,一個Subject既是一個Obserable也是一個Observer,他既可以發出事件,也可以監聽事件。
PublishSubject
當你訂閱PublishSubject的時候,你只能接收到訂閱他之后發生的事件。subject.onNext()發出onNext事件,對應的還有onError()和onCompleted()事件
let disposeBag = DisposeBag()
let publishSubject = PublishSubject<String>()
publishSubject.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
publishSubject.onNext("1")
publishSubject.onNext("2")
publishSubject.onNext("3")
publishSubject.onCompleted()
next(1)
next(2)
next(3)
completed
ReplaySubject
當你訂閱ReplaySubject的時候,你可以接收到訂閱他之后的事件,但也可以接受訂閱他之前發出的事件,接受幾個事件取決與bufferSize的大小
let disposeBag = DisposeBag()
let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
replaySubject.onNext("a")
replaySubject.onNext("b")
replaySubject.onNext("c")
replaySubject subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
replaySubject.onNext("1")
replaySubject.onNext("2")
replaySubject.onNext("3")
replaySubject.onCompleted()
next(b)
next(c)
next(1)
next(2)
next(3)
completed
BehaviorSubject
當你訂閱了BehaviorSubject,你會接受到訂閱之前的最后一個事件。
let disposeBag = DisposeBag()
let behaviorSubject = BehaviorSubject(value: "abc")
behaviorSubject.onNext("a")
behaviorSubject.onNext("b")
behaviorSubject.onNext("c")
behaviorSubject.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
behaviorSubject.onNext("1")
behaviorSubject.onNext("2")
behaviorSubject.onNext("3")
behaviorSubject.onCompleted()
next(c)
next(1)
next(2)
next(3)
completed
Variable
Variable是BehaviorSubject一個包裝箱,就像是一個箱子一樣,使用的時候需要調用asObservable()拆箱,里面的value是一個BehaviorSubject,他不會發出error事件,但是會自動發出completed事件。
let disposeBag = DisposeBag()
let variable = Variable("abc")
variable.value = "1"
variable.value = "2"
variable.asObservable().subscribe { (evevt) in
print(evevt)
}.disposed(by: disposeBag)
variable.value = "a"
variable.value = "b"
variable.value = "c"
next(2)
next(a)
next(b)
next(c)
completed