一同养成写作习惯!这是我参加「日新计划 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运用和原理。

