RxSwift_v1.0筆記——3 Subjects
Subject——可以看做是一種代理和橋梁。它既是訂閱者又是訂閱源,這意味著它既可以訂閱其他 Observable 對象,同時(shí)又可以對它的訂閱者們發(fā)送事件欠母。
開始 63
與PublishSubjects工作 64
當(dāng)你訂閱PublishSubject的時(shí)候爬早,你只能接收到訂閱他之后發(fā)生的事件
開始是空并且僅僅發(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
在新的訂閱對象訂閱的時(shí)候會發(fā)送最近發(fā)送的事件捍掺,如果沒有則發(fā)送一個(gè)默認(rèn)值撼短。
開始有一個(gè)初始值,并且重復(fù)發(fā)送它(如果沒有新元素)或發(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
在新的訂閱對象訂閱的時(shí)候會補(bǔ)發(fā)所有已經(jīng)發(fā)送過的數(shù)據(jù)隊(duì)列曲横, bufferSize 是緩沖區(qū)的大小,決定了補(bǔ)發(fā)隊(duì)列的最大值不瓶。如果 bufferSize 是1禾嫉,那么新的訂閱者出現(xiàn)的時(shí)候就會補(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)勢是:不會被顯式終結(jié)黍匾。即:不會收到 .Completed 和 .Error 這類的終結(jié)事件,它會主動在析構(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