一同养成写作习惯!这是我参加「日新计划 4 月更文应战」的第14天,点击检查活动详情。

本文首要介绍subject的子类PublishSubjectBehaviorSubject运用和简略的原理。

1. SubjectType

关于我们的序列,通常创建的时分在subscriberHandle闭包中调用观察者observsronNext发送工作。比如:

//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就应运而生

RxSwift学习-12-Subject的运用(上)

协议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)
  }

打印效果

RxSwift学习-12-Subject的运用(上)

可以发现我们之前发送的工作没有保存,只需订阅后发送的工作才进行了回调。

1.1 初始化

检查下原理

RxSwift学习-12-Subject的运用(上)

首要它遵照了我们之前看的SubjectType协议因此具有了订阅和发送的工作的才干。其次保存了我们订阅者Observers,让它具有了状况的保存。这儿举个例子

RxSwift学习-12-Subject的运用(上)
关于一般序列,订阅的时分会调用订阅闭包。可是我们其实只需要一次,通常我们可以运用share共享

RxSwift学习-12-Subject的运用(上)

我们运用publishconnect

RxSwift学习-12-Subject的运用(上)

也是相同的作用,都是一次发送多个订阅

2.2 订阅

RxSwift学习-12-Subject的运用(上)
对我们的数据处理进行加锁处理

RxSwift学习-12-Subject的运用(上)

要害字defer 标明return后调用,进行解锁。我们日常开发的时分也可以这样运用。
闭包调用会synchronized_subscribe办法并传入我们外部的eventHanlde闭包。首要判断闭包的状况,我们不必太关注。

我们关注下画框的要害当地 ,这儿我们observers是一个数组刺进我们订阅的回调工作eventHandlobserver.on

  • SubscriptionDisposable 我们看下这儿保存我们key即之前的订阅工作回调数组,毁掉的时分处理数组

RxSwift学习-12-Subject的运用(上)

2.2 发送

RxSwift学习-12-Subject的运用(上)

发送的时分调用dispatch(),首要会调用里面的参数即调用synchronized_on办法

RxSwift学习-12-Subject的运用(上)
该办法可以发现会返回我们订阅的时分保存的observers(eventHandle订阅的闭包)数组。关于complete和error事件则是处理清空。
我们这个时分会调用我们的dispatch(self.synchronized_on(event), event)。传入我们的工作回调数组,和工作类型。
RxSwift学习-12-Subject的运用(上)

首要调用工作数组的第一个闭包进行回调

RxSwift学习-12-Subject的运用(上)
我认为这样是为了节省时间减少一些逻辑上的处理。比我我们取数组的第一个值,没有的话就标明有问题,不必走下面的流程

RxSwift学习-12-Subject的运用(上)

因为我们开端的时分没有订阅直接发送工作,所以我们的工作回调闭包数组为空。当我们订阅的时分。进入on之后调用onCore

RxSwift学习-12-Subject的运用(上)

关于_onlyFastPath标明是否只需一个订阅者,走快速通道。

RxSwift学习-12-Subject的运用(上)

当我们有2个订阅者的时分

RxSwift学习-12-Subject的运用(上)

会获取除掉第一个剩下的回调数组进行回调

_dictionary 关于_dictionary寄存的是我们终究的一个闭包回调,只需刺进的时分我们回调数组大于30的时分才会存储

RxSwift学习-12-Subject的运用(上)

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)
 
  }

打印效果

RxSwift学习-12-Subject的运用(上)

我们简略分析下

  • 初始化
    RxSwift学习-12-Subject的运用(上)

初始化的时分会保存我们的元素

  • 订阅 订阅的时分比较PublishSubject多了一步自动调用订阅eventHandle的回调

RxSwift学习-12-Subject的运用(上)

  • 发送工作

RxSwift学习-12-Subject的运用(上)
保存我们发送的元素,这样在有订阅者订阅的时分会发送终究一次发送的元素

4. 总结

首要介绍了PublishSubjectbehaviorSubject的运用,经过详细评论Publish Subject,让我们知道了subject具有了subscribe和on的特性,然后既能订阅也能发送呼应。后边介绍下余下的几种subject运用和原理。