RxSwift_v1.0筆記——3 Subjects
Subject——可以看做是一種代理和橋梁。它既是訂閱者又是訂閱源,這意味著它既可以訂閱其他 Observable 對(duì)象,同時(shí)又可以對(duì)它的訂閱者們發(fā)送事件。
開(kāi)始 63
與PublishSubjects工作 64
當(dāng)你訂閱PublishSubject的時(shí)候,你只能接收到訂閱他之后發(fā)生的事件
開(kāi)始是空并且僅僅發(fā)射新元素給訂閱中。

example(of: "PublishSubject") {
let subject = PublishSubject<String>()
subject.onNext("Is anyone listening?")
let subscriptionOne = subject
.subscribe(onNext: { string in
print(string)
})
subject.on(.next("1"))
subject.onNext("2")
let subscriptionTwo = subject
.subscribe { event in
print("2)", event.element ?? event)
}
subject.onNext("3")
subscriptionOne.dispose()
subject.onNext("4")
// 1
subject.onCompleted()
// 2
subject.onNext("5")
// 3
subscriptionTwo.dispose()
let disposeBag = DisposeBag()
// 4
subject
.subscribe {
print("3)", $0.element ?? $0)
}
.addDisposableTo(disposeBag)
subject.onNext("?")
}
--- Example of: PublishSubject ---
1
2
3
2) 3
2) 4
2) completed
3) completed
與BehaviorSubjects工作 67
在新的訂閱對(duì)象訂閱的時(shí)候會(huì)發(fā)送最近發(fā)送的事件,如果沒(méi)有則發(fā)送一個(gè)默認(rèn)值。
開(kāi)始有一個(gè)初始值,并且重復(fù)發(fā)送它(如果沒(méi)有新元素)或發(fā)射最新的元素給訂閱中。
// 1
enum MyError: Error {
case anError
}
// 2
func print<T: CustomStringConvertible>(label: String, event: Event<T>) {
print(label, event.element ?? event.error ?? event)
}
// 3
example(of: "BehaviorSubject") {
// 4
let subject = BehaviorSubject(value: "Initial value")
let disposeBag = DisposeBag()
subject
.subscribe {
print(label: "1)", event: $0)
}
.addDisposableTo(disposeBag)
subject.onNext("X")
// 1
subject.onError(MyError.anError)
// 2
subject
.subscribe {
print(label: "2)", event: $0)
}
.addDisposableTo(disposeBag)
}
--- Example of: BehaviorSubject ---
1) Initial value
1) X
1) anError
2) anError
與ReplaySubject工作 69
在新的訂閱對(duì)象訂閱的時(shí)候會(huì)補(bǔ)發(fā)所有已經(jīng)發(fā)送過(guò)的數(shù)據(jù)隊(duì)列, bufferSize 是緩沖區(qū)的大小,決定了補(bǔ)發(fā)隊(duì)列的最大值。如果 bufferSize 是1,那么新的訂閱者出現(xiàn)的時(shí)候就會(huì)補(bǔ)發(fā)上一個(gè)事件,如果是2,則補(bǔ)兩個(gè),以此類推。
使用緩沖區(qū)大小初始化,將保持元素的緩沖區(qū)達(dá)到該大小,并將其重新發(fā)送它給新的訂閱著。

example(of: "ReplaySubject") {
// 1
let subject = ReplaySubject<String>.create(bufferSize: 2)
let disposeBag = DisposeBag()
// 2
subject.onNext("1")
subject.onNext("2")
subject.onNext("3")
// 3
subject
.subscribe {
print(label: "1)", event: $0)
}
.addDisposableTo(disposeBag)
subject
.subscribe {
print(label: "2)", event: $0)
}
.addDisposableTo(disposeBag)
subject.onNext("4")
subject.onError(MyError.anError)
subject.dispose()
subject
.subscribe {
print(label: "3)", event: $0)
}
.addDisposableTo(disposeBag)
}
--- Example of: ReplaySubject ---
1) 2
1) 3
2) 2
2) 3
1) 4
2) 4
1) anError
2) anError
3) Object `RxSwift.(ReplayMany in _33052C2CE59F358A8740AFDD4371DD39)<Swift.String>` was already disposed.
與Variable工作 72
是基于 BehaviorSubject 的一層封裝,它的優(yōu)勢(shì)是:不會(huì)被顯式終結(jié)。即:不會(huì)收到 .Completed 和 .Error 這類的終結(jié)事件,它會(huì)主動(dòng)在析構(gòu)的時(shí)候發(fā)送 .Complete 。需要調(diào)用它自帶的asObservable()方法進(jìn)行轉(zhuǎn)化后才能被訂閱。
example(of: "Variable") {
// 1
var variable = Variable("Initial value")
let disposeBag = DisposeBag()
// 2
variable.value = "New initial value"
// 3
variable.asObservable()
.subscribe {
print(label: "1)", event: $0)
}
// .addDisposableTo(disposeBag)
// 1
variable.value = "1"
// 2
variable.asObservable()
.subscribe {
print(label: "2)", event: $0)
}
.addDisposableTo(disposeBag)
// 3
variable.value = "2"
}
--- Example of: Variable ---
1) New initial value
1) 1
2) 1
1) 2
2) 2
1) completed