美文网首页Rx
RxSwift源码分析(5)——skip

RxSwift源码分析(5)——skip

作者: 无悔zero | 来源:发表于2020-10-03 10:52 被阅读0次

    这一篇内容算是承接上一篇来顺道讲讲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次响应")
    })
    

    相关文章

      网友评论

        本文标题:RxSwift源码分析(5)——skip

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