事件池当然-RxSwift-做的非常好

35次阅读

共计 878 个字符,预计需要花费 3 分钟才能阅读完成。

网络请求到的数据,BehaviorSubject 作为事件仓库 store,

BehaviorSubject 用户行为事件源,保持住最新的事件。

用户行为点击,采用 PublishSubject 即时事件源,马上 fire,作为开关,发起 BehaviorSubject 存储的事件

场景:网络请求到的数据,不是马上展示。是用户点击某个按钮后,才展示


网络请求到的数据,不是马上展示,就需要用 BehaviorSubject 把这个事件 hold 住。

用户点击某个按钮后,才展示。采用 PublishSubject,作为上面事件的开关,fire 开启事件

代码部分:


struct PerViewModel {private let inputTap = PublishSubject<Bool>()

     private let inputNet = BehaviorSubject<Model?>(value: nil)


     var outputNetPop: Observable<Model?>


     init() {let netOK = inputNet.filter { $0 != nil}       
           outputNetPop = netOK.sample(inputTap)
     }


    func click(){inputTap.onNext(true)
     }

    func popUp(net data: Model){inputNet.onNext(data)
    }
}

RxSwift 的 Operator , Sample 具有这个特性


sample 操作符,可以不定期的(根据需要)对源 Observable (第 1 个) 进行采样操作。

通过第二个 Observable(开关)来控制采样时机。

一旦第二个 Observable(开关)发出一个元素,就从源 Observable (第 1 个) 中取出,最后产生的元素


RxSwift 的 flatMap,和 flatMapLatest,我们用起来,一般没什么差别

  • 按钮点击,是一个事件的连续流,
  • 网络请求,不是一个事件的连续流, 一次性的消耗事件,标准的 trait 特性 Single
  • FlatMap

  • FlatMapLatest

因为切换订阅对象的情况很少。

一般不会切换,产生订阅事件流的事件流

正文完
 0