一同养成写作习惯!这是我参加「日新计划 4 月更文应战」的第14天,点击检查活动详情。
本文首要介绍subject的子类PublishSubject
和BehaviorSubject
运用和简略的原理。
1. SubjectType
关于我们的序列,通常创建的时分在subscriberHandle
闭包中调用观察者observsr
的onNext
发送工作。比如:
//1.创建
let ob = Observable<Any>.create{ (obserber) -> Disposable in
//3.发送信号
obserber.onNext("hello")
obserber.onError(NSError.init(domain: "NetWorkError", code: 400, userInfo: nil))
//obserber.onCompleted()
return Disposables.create()
}
//2.订阅
ob.subscribe(onNext: { (value) in
print(value)
}, onError:{ (error) in
print(error)
} , onCompleted: {
print("订阅结束")
}, onDisposed: {
print("订阅毁掉")
}).disposed(by: disposeBag)
很费事,我们期望我们可观察序列
既可以具有观察者的发送工作on
,也可以subscribe订阅
。因此SubjectType
就应运而生
协议SubjectType
遵照了ObservableType
协议,因此可以subscribe
,一起相关类型遵照ObserverType
协议,因此具有了发送工作on
的才干。我们界说的类遵照该协议就具有了订阅和发送
工作的才干。下面介绍下遵照该协议的类如何运用
2. PublishSubject
先看下运用
/// 订阅subscribe后才会收效
func publishSubjectMethod() {
let publishSubject = PublishSubject<Int>()
publishSubject.onNext(1)
publishSubject.onNext(2)//没有保存值
publishSubject.subscribe(onNext: {print("publishSubject第一次订阅",$0)})
.disposed(by: disposeBag)
publishSubject.onNext(3)
publishSubject.subscribe(onNext: {print("publishSubject再次订阅",$0)})
.disposed(by: disposeBag)
publishSubject.onNext(4)
}
打印效果
可以发现我们之前发送的工作没有保存
,只需订阅后发送的工作
才进行了回调。
1.1 初始化
检查下原理
首要它遵照了我们之前看的SubjectType
协议因此具有了订阅和发送的工作的才干。其次保存了我们订阅者Observers
,让它具有了状况的保存。这儿举个例子
关于一般序列,订阅的时分会调用订阅闭包。可是我们其实只需要一次,通常我们可以运用share共享
我们运用publish
后connect
也是相同的作用,都是一次发送多个订阅
。
2.2 订阅
对我们的数据处理进行加锁处理
要害字defer
标明return后调用
,进行解锁
。我们日常开发的时分也可以这样运用。
闭包调用会synchronized_subscribe
办法并传入我们外部的eventHanlde
闭包。首要判断闭包的状况,我们不必太关注。
我们关注下画框的要害当地
,这儿我们observers
是一个数组刺进
我们订阅的回调工作eventHandl
即observer.on
。
-
SubscriptionDisposable
我们看下这儿保存我们key
即之前的订阅工作回调数组,毁掉的时分处理数组
。
2.2 发送
发送的时分调用dispatch()
,首要会调用里面的参数即调用synchronized_on
办法
该办法可以发现会返回我们订阅的时分保存的observers
(eventHandle订阅的闭包)数组。关于complete和error事
件则是处理清空。
我们这个时分会调用我们的dispatch(self.synchronized_on(event), event)
。传入我们的工作回调数组,和工作类型。
首要调用工作数组的第一个闭包进行回调
我认为这样是为了节省时间
,减少一些逻辑上
的处理。比我我们取数组的第一个值,没有的话就标明有问题,不必走下面的流程
因为我们开端的时分没有订阅直接发送工作,所以我们的工作回调闭包数组为空
。当我们订阅的时分。进入on之后调用onCore
关于_onlyFastPath
标明是否只需一个订阅者
,走快速通道。
当我们有2个订阅者的时分
会获取除掉第一个剩下的回调数组进行回调
– _dictionary
关于_dictionary
寄存的是我们终究的一个闭包回调
,只需刺进的时分我们回调数组大于30
的时分才会存储。
3. BehaviorSubject
关于BehaviorSubject
和我们的PublishSubject
类似的,只是多了一个保存我们发送元素的值
。
- 运用
/// 在订阅前保存一个值
func behaviorSubjectMethod() {
let behaviorSubject = BehaviorSubject<Int>.init(value: 2)
behaviorSubject.subscribe(onNext: {print("BehaviorSubject初度订阅",$0)})
.disposed(by: disposeBag)
behaviorSubject.onNext(4)
behaviorSubject.subscribe(onNext: {print("BehaviorSubject再次订阅",$0)})
.disposed(by: disposeBag)
behaviorSubject.onNext(5)
}
打印效果
我们简略分析下
- 初始化
初始化的时分会保存我们的元素
- 订阅
订阅的时分比较
PublishSubject
多了一步自动调用
订阅eventHandle
的回调
- 发送工作
保存我们发送的元素,这样在有订阅者订阅的时分会发送终究一次发送的元素
。
4. 总结
首要介绍了PublishSubject
和behaviorSubject
的运用,经过详细评论Publish Subject
,让我们知道了subject具有了subscribe和on
的特性,然后既能订阅也能发送呼应。后边介绍下余下的几种subject运用和原理。