推荐书本: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)
}
网友评论