当咱们须要建立一个 Observable的时候,要预先将要发送的信号或数据准备好,等到有subscribe时再将数据经过 onXX发出去。 可是,当须要Observable 在运行时能动态地获取一个新的数据时候,再经过onXX发送给订阅者,以实现“联动”的效果。咱们就要用到了Subject。bash
SubjectSubject是一个代理,它是特殊的序列,既是Observer,同时又是Observable Subject分为:PublishSubject、BehaviorSubject、ReplaySubject、AsyncSubject、BehaviorRelaydom
-PublishSubject的建立须要定义类型,但不须要初始值。 -PublishSubject的订阅序列只能接收到subscribe以后的onXX事件,不能接收到subscribe以前的onXX事件。ui
// 1:初始化序列
let publishSub = PublishSubject<Int>()
//初始化一个PublishSubject 装着Int类型的序列
// 2:发送响应序列
publishSub.onNext(1)
// 3:订阅序列
publishSub.subscribe { print("订阅到了:",$0)}
.disposed(by: disposbag)
// 再次发送响应
publishSub.onNext(2)
publishSub.onNext(3)
复制代码
订阅到了: next(2)
订阅到了: next(3)
复制代码
-BehaviorSubject 须要的建立须要给定一个初始的默认值,第一次subscribe以前若是没有发送onXX事件,那么订阅到的就是这个初始的默认值。若是第一次subscribe以前发送了onXX事件,那么会把初始值覆盖掉。 -若是subscribe以前发送多个onXX事件,只会保留临近的一个; subscribe以后发送的onXX事件都会执行spa
// 1:建立序列
let behaviorSub = BehaviorSubject.init(value: 100)
// 2:发送信号
behaviorSub.onNext(1)
behaviorSub.onNext(2)
// 3:订阅序列
behaviorSub.subscribe{ print("第一次订阅到了:",$0)}
.disposed(by: disposbag)
// 再次发送
behaviorSub.onNext(3)
behaviorSub.onNext(4)
// 再次订阅
behaviorSub.subscribe{ print("第二次订阅到了:",$0)}
.disposed(by: disposbag)
复制代码
第一次订阅到了: next(2)
第一次订阅到了: next(3)
第一次订阅到了: next(4)
第二次订阅到了: next(4)
复制代码
若是初始化设置bufferSize,那么连续发送信号,而subscribe可以订阅到的最大数量为bufferSize3d
设置bufferSize代理
// 1:建立序列
let replaySub = ReplaySubject<Int>.create(bufferSize: 2)
// 2:发送信号
replaySub.onNext(1)
replaySub.onNext(2)
replaySub.onNext(3)
replaySub.onNext(4)
// 3:订阅序列
replaySub.subscribe{ print("订阅到了:",$0)}
.disposed(by: disposbag)
// 再次发送
replaySub.onNext(7)
replaySub.onNext(8)
replaySub.onNext(9)
复制代码
订阅到了: next(3)
订阅到了: next(4)
订阅到了: next(7)
订阅到了: next(8)
订阅到了: next(9)
复制代码
createUnbounded,不设置bufferSizecode
// 1:建立序列
let replaySub = ReplaySubject<Int>.createUnbounded()
// 2:发送信号
replaySub.onNext(1)
replaySub.onNext(2)
replaySub.onNext(3)
replaySub.onNext(4)
// 3:订阅序列
replaySub.subscribe{ print("订阅到了:",$0)}
.disposed(by: disposbag)
// 再次发送
replaySub.onNext(7)
replaySub.onNext(8)
replaySub.onNext(9)
复制代码
订阅到了: next(1)
订阅到了: next(2)
订阅到了: next(3)
订阅到了: next(4)
订阅到了: next(7)
订阅到了: next(8)
订阅到了: next(9)
复制代码
遇到onError的话,onError以前的onXX发送所有做废cdn
// 1:建立序列
let asynSub = AsyncSubject<Int>.init()
// 2:发送信号
asynSub.onNext(1)
asynSub.onNext(2)
// 3:订阅序列
asynSub.subscribe{ print("订阅到了:",$0)}
.disposed(by: disposbag)
// 再次发送
asynSub.onNext(3)
asynSub.onNext(4)
asynSub.onError(NSError.init(domain: "EpisodeError", code: 10086, userInfo: nil))
asynSub.onCompleted()
复制代码
订阅到了: error(Error Domain=EpisodeError Code=10086 "(null)")
复制代码
BehaviorRelay替代Variable, 无需手写 on(event)事件,只需给属性赋值便可获取事件响应。server
// 1:建立序列
let behaviorRelay = BehaviorRelay(value: 1)
// 3:订阅序列
behaviorRelay.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposbag)
print("accept前:\(behaviorRelay.value)")
// 2:发送信号
behaviorRelay.accept(100)
print("accept后:\(behaviorRelay.value)")
复制代码
1
accept前:1
100
accept后:100
订阅到了: completed
复制代码