美文网首页RxSwift源码解析
checkSelectorIsObservable case 验

checkSelectorIsObservable case 验

作者: 狼性刀锋 | 来源:发表于2018-11-10 18:17 被阅读12次

checkSelectorIsObservable case 验证

要触发第三个case需满足以下条件

  1. delegate method 返回值不为空

但根据消息转发策略

        override open func responds(to aSelector: Selector!) -> Bool {
            
            print("\(aSelector): responds = \(responds)")
            
            return super.responds(to: aSelector)
                || (self._forwardToDelegate?.responds(to: aSelector) ?? false)
                || (self.voidDelegateMethodsContain(aSelector) && self.hasObservers(selector: aSelector))
        }
        

永远无法触发第三个case, 而第二个case 与 if !(self._forwardToDelegate?.responds(to: selector) ?? true) 相违背。

所以经过分析 应该只有以下的情况会触发case


extension Reactive where Base: UIScrollView {


    public var viewForZooming: ControlEvent<Void> {

         let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.viewForZooming(in:))).map { _ in }

        return ControlEvent(events: source)
    }



}



// 订阅 这样就可以满足 hasObservers

        _ = scrollView.rx.viewForZooming.subscribe { print($0) }
        // 设置delegate
        scrollView.delegate = self
        // 这个操作会触发 setForwardToDelegate ,从而触发 checkSelectorIsObservable
       _ = scrollView.rx.viewForZooming.subscribe { event in
            print("viewForZooming")
        }



结果

最终会触发第三个分支警告, 不过这样代码显然没有意义,这是一个异常分支,在编码的时候就应该避免它

相关文章

网友评论

    本文标题:checkSelectorIsObservable case 验

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