推薦書本:RxSwift
電子版地址:https://pan.baidu.com/s/1bp8MlC7 密碼 5tjx
本文是RxSwift書本 學習筆記
書本code地址:https://pan.baidu.com/s/1o7GVBrO
Subject 可以看做是一種代理和橋梁。它既是訂閱者又是訂閱源。
作為一個觀察者和觀察者。您早就看到了他們如何接收事件并訂閱。該主題接收到下一個事件,每次收到一個事件時,它都會將它發送給它的訂閱者。
當你訂閱PublishSubject的時候,你只能接收到訂閱他之后發生的事件。subject.onNext()發出onNext事件,對應的還有onError()和onCompleted()事件
func writeSequenceToConsole<O: ObservableType>(name: String, sequence: O) {
sequence
.subscribe { e in
print("Subscription: \(name), event: \(e)")
}
}
example(of: "PublishSubject") {
let subject = PublishSubject<String>()
writeSequenceToConsole(name: "1", sequence: subject)
subject.onNext("Is anyone Listeing?")
subject.on(.next("1"))
subject.on(.next("2"))
writeSequenceToConsole(name: "2", sequence: subject)
subject.onNext("Is anyone Listeing?")
subject.on(.next("1"))
subject.on(.next("2"))
}
ReplaySubject 在新的訂閱對象訂閱的時候會補發所有已經發送過的數據隊列, bufferSize 是緩沖區的大小,決定了補發隊列的最大值。如果 bufferSize 是1,那么新的訂閱者出現的時候就會補發上一個事件,如果是2,則補兩個,以此類推。(距觀察,補發的事件是先進后出)
![Uploading image_072992.png . . .]
example(of: "ReplaySubject") {
let subject = ReplaySubject<String>.create(bufferSize: 1)
writeSequenceToConsole(name: "1", sequence: subject)
subject.onNext("Is anyone Listeing? 1")
subject.on(.next("a"))
subject.on(.next("b"))
writeSequenceToConsole(name: "2", sequence: subject)
subject.onNext("Is anyone Listeing? 2")
subject.on(.next("c"))
subject.on(.next("d"))
}
========================================
BehaviorSubject
BehaviorSubject 在新的訂閱對象訂閱的時候會發送最近發送的事件,如果沒有則發送一個默認值。
================================
Variable
Variable 是基于 BehaviorSubject 的一層封裝,它的優勢是:不會被顯式終結。即:不會收到 .Completed 和 .Error 這類的終結事件,它會主動在析構的時候發送 .Complete 。
================================
Variable
Variable 是基于 BehaviorSubject 的一層封裝,它的優勢是:不會被顯式終結。即:不會收到 .Completed 和 .Error 這類的終結事件,它會主動在析構的時候發送 .Complete 。
需要通過asObservable()方法來訪問其behavior subject.主題
example(of: "Variable") {
let variable = Variable("z")
let disposeBag = DisposeBag()
variable.value = "new initial"
variable.asObservable().subscribe{print("1)\($0)")}.addDisposableTo(disposeBag)
}