学会使用Subjects
Subject是Observable和Observer之间的桥梁,一个Subject既是一个Obserable也是一个Observer,它既可以发出事件,也可以监听事件.
PublishSubject
当你订阅PublishSubject的时候,你只能接收到订阅他之后发生的事件。subject.onNext()发出onNext事件,对应的还有onError()和onCompleted()事件
// 1.PublishSubject 只能接收到订阅他之后发生的事件
func publishSubject() {
print("\n publishSubject test---")
let disposeBag = DisposeBag()
let subject = PublishSubject<String>()
subject.onNext("001") // subscribe之前的不会收到
subject.subscribe{print($0)}.addDisposableTo(disposeBag)
subject.onNext("002")
subject.onNext("003")
}
publishSubject test---
002
003
ReplaySubject
当你订阅ReplaySubject的时候,你可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小
// 2.ReplaySubject 可以接收到订阅他之后的事件,也可以接受订阅他之前发出的事件,接受几个事件取决与bufferSize的大小
func replaySubject() {
print("\n replaySubject test---")
let disposeBag = DisposeBag()
let subject = ReplaySubject<String>.create(bufferSize: 1)
subject.onNext("100")
subject.onNext("101")
subject.subscribe{print($0)}.addDisposableTo(disposeBag)
subject.onNext("102")
subject.onNext("103")
}
replaySubject test---
101
102
103
BehaviorSubject
当你订阅了BehaviorSubject,你会接受到订阅之前的最后一个事件。
// 3.BehaviorSubject 可以接收到订阅他之后的事件,也可以接受到订阅之前的最后一个事件
func behaviorSubject() {
print("\n behaviorSubject test---")
let disposeBag = DisposeBag()
let subject = BehaviorSubject(value: "200")
subject.onNext("201")
subject.onNext("202")
subject.subscribe{print($0)}.addDisposableTo(disposeBag)
subject.onNext("203")
subject.onNext("204")
}
behaviorSubject test---
202
203
204
PublishSubject, ReplaySubject和BehaviorSubject是不会自动发出completed事件的。
Variable
Variable是BehaviorSubject一个包装箱,就像是一个箱子一样,使用的时候需要调用asObservable()拆箱,里面的value是一个BehaviorSubject,他不会发出error事件,但是会自动发出completed事件。
// 4.Variable是BehaviorSubject一个包装箱,使用的时候需要调用asObservable(),Variable没有on系列方法,只提供了value属性。
// Variable可以用来储存数据,因为我们可以拥有value的get和set方法
// 不会发出error事件,但是会自动发出completed事件。
func variable() {
print("\n variable test---")
let disposeBag = DisposeBag()
let variable = Variable("300")
variable.value = "301"
variable.value = "302"
variable.asObservable().subscribe { print($0)}.addDisposableTo(disposeBag)
variable.value = "303"
variable.value = "304"
}
variable test---
300
302
303
304