Rx

RxSwift源码分析(5)——skip

2020-10-03  本文已影响0人  无悔zero

这一篇内容算是承接上一篇来顺道讲讲skip,以下是例子:

textFiled.rx.text
.skip(1)
.subscribe(onNext: { (text) in
     print("跳过了第1次响应")
})
  1. 我们直接来看看skip的源码,返回的是继承了ProducerSkipCount序列:
extension ObservableType {
    public func skip(_ count: Int)
        -> Observable<E> {
        return SkipCount(source: self.asObservable(), count: count)
    }
}
final private class SkipCount<Element>: Producer<Element> {
    ...
}
  1. 在外面进行订阅后,根据RxSwift核心逻辑会来到run函数:
.subscribe(onNext: { (text) in
    ...
})
final private class SkipCount<Element>: Producer<Element> {
    ...
    init(source: Observable<Element>, count: Int) {
        self.source = source
        self.count = count
    }
    
    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {
        let sink = SkipCountSink(parent: self, observer: observer, cancel: cancel)
        let subscription = self.source.subscribe(sink)

        return (sink: sink, subscription: subscription)
    }
}
  1. 然后可以发现是由SkipCountSink来进行处理下沉业务,但是这里会进行另一个订阅:self.source.subscribe(sink),是由textFiled.rx.text源序列进行的订阅。继续根据RxSwift核心逻辑,最后会调用sink.on(也就是SkipCountSinkon函数):
inal private class SkipCountSink<O: ObserverType>: Sink<O>, ObserverType {
    ...
    init(parent: Parent, observer: O, cancel: Cancelable) {
        self.parent = parent
        self.remaining = parent.count//保存跳过次数
        super.init(observer: observer, cancel: cancel)
    }

    func on(_ event: Event<Element>) {
        switch event {
        case .next(let value):
            //跳过响应
            if self.remaining <= 0 {
                self.forwardOn(.next(value))
            }
            else {
                self.remaining -= 1
            }
        case .error: ...
        case .completed: ...
        }
    }
}

.next事件会用if self.remaining <= 0 { }来判断是否跳过,如果剩余跳过次数大于0,则self.remaining -= 1,直到剩余跳过次数为0,才会进行下一步self.forwardOn(.next(value))。根据RxSwift核心逻辑,最终会在外面响应:

.subscribe(onNext: { (text) in
     print("跳过了第1次响应")
})
上一篇 下一篇

猜你喜欢

热点阅读