美文网首页swift
RxSwift 常用方法小记

RxSwift 常用方法小记

作者: SapientiaWind | 来源:发表于2018-11-05 10:51 被阅读16次

    debounce / throttle :

    -- debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType) 。
    -- 方法原文档的解释:  Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers。 大致意思的就是在规定时间内过滤掉高频元素只返回最后发出的元素。
    -- throttle(_ dueTime: RxTimeInterval, latest: Bool = default, scheduler: SchedulerType) 。
    -- 方法原文档的解释:  Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration。 这个方法与debounce 刚好相反可以返回规定时间内的第一个元素和最后一个元素,另外设置latest(默认为true) 为false 可以实现只返回第一个元素。
    
    **在我看来这两个方法都能够很好的实现Button防连击,用法在个人,随意发挥**
    

    flatMapLatest / flatMapFirst:

    -- flatMapLatest<O>(_ selector: @escaping (Self.E) throws -> O)。
    -- flatMapLatest 操作符将源 Observable 的每一个元素应用一个转换方法,将他们转换成 Observables。一旦转换出一个新的 Observable,就只发出它的元素,旧的 Observables 的元素将被忽略掉,也就是只接收最新的value事件。
    -- flatMapFirst<O>(_ selector: @escaping (Self.E) throws -> O)。
    -- flatMapFirst 与 flatMapLatest 正好相反:flatMapFirst 只会接收最初的 value 事件。这个方法可以很好的拿来防止重复的操作或者网络请求。
    

    combineLatest / withLatestFrom

    -- combineLatest<O1, O2, O3>(_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> Self.E)。
    -- combineLatest 操作符将多个 Observables 中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。这些源 Observables 中任何一个发出一个元素,他都会发出一个元素(前提是,这些 Observables 曾经发出过元素)。
    -- 注1:  如果有一个源没有发出,就会继承上次的值。
    -- withLatestFrom<SecondO>(_ second: SecondO)。
    -- withLatestFrom 操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组合的结果发出来。当第一个 Observable 发出一个元素时,就立即取出第二个 Observable 中最新的元素,通过一个组合函数将两个最新的元素合并后发送出去。这个解释比较绕,看一个例子吧:
         let disposeBag = DisposeBag()
         let firstSubject = PublishSubject<String>()
         let secondSubject = PublishSubject<String>()
    
         firstSubject
            .withLatestFrom(secondSubject)
            .subscribe(onNext: { print($0) })
            .disposed(by: disposeBag)
    
          firstSubject.onNext("first 第一次")
          secondSubject.onNext("second 第一次")
          firstSubject.onNext("first 第二次")
      **只会输出 second 第一次**
      **也就是说当secondSubject有新值的时候再发送firstSubject就能得到secondSubject发送出来的值了,且只能得到secondSubject。**

    相关文章

      网友评论

        本文标题:RxSwift 常用方法小记

        本文链接:https://www.haomeiwen.com/subject/nibjxqtx.html