RxSwift源码分析(5)——skip
2020-10-03 本文已影响0人
无悔zero
这一篇内容算是承接上一篇来顺道讲讲skip,以下是例子:
textFiled.rx.text
.skip(1)
.subscribe(onNext: { (text) in
print("跳过了第1次响应")
})
- 我们直接来看看
skip
的源码,返回的是继承了Producer
的SkipCount
序列:
extension ObservableType {
public func skip(_ count: Int)
-> Observable<E> {
return SkipCount(source: self.asObservable(), count: count)
}
}
final private class SkipCount<Element>: Producer<Element> {
...
}
- 在外面进行订阅后,根据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)
}
}
- 然后可以发现是由
SkipCountSink
来进行处理下沉业务,但是这里会进行另一个订阅:self.source.subscribe(sink)
,是由textFiled.rx.text
源序列进行的订阅。继续根据RxSwift核心逻辑,最后会调用sink.on
(也就是SkipCountSink
的on
函数):
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次响应")
})