RxSwift-tap

点击之后打印 主线程,Why

        DispatchQueue.global().async {
            print("请求数据")
            self.button.rx.tap.subscribe(onNext: { () in
                print("tap = --- \(Thread.current)")
            })
        }
请求数据
tap = --- {number = 1, name = main}
步骤1:点击tap
    public var tap: ControlEvent {
        return controlEvent(.touchUpInside)
    }
步骤2:点击controlEvent( )

2.1 方法controlEvent返回ControlEvent
2.2 .create{} 闭包中已经是主线程,MainScheduler.ensureRunningOnMainThread()这是一个说明
2.3 现在就要看这个闭包执行之前做了什么操作
2.4 2.1方法的返回值ControlEvent执行.subscribe(onNext: ) -> 3.1 ControlEvent..subscribe(onNext: )
2.5 return ControlEvent(events: source) 会来到 4.1传入source 然后source依附在ConcurrentMainScheduler.instance上

    public func controlEvent(_ controlEvents: UIControl.Event) -> ControlEvent<()> {
        let source: Observable = Observable.create { [weak control = self.base] observer in
                MainScheduler.ensureRunningOnMainThread()

                guard let control = control else {
                    observer.on(.completed)
                    return Disposables.create()
                }
                let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) { _ in
                    observer.on(.next(()))
                }
                return Disposables.create(with: controlTarget.dispose)
            }
            .takeUntil(deallocated)

        return ControlEvent(events: source)
    }
步骤3:点击外界 .subscribe(onNext: )

3.1 ControlEvent.subscribe(onNext: )
3.2 return Disposables.create( self.asObservable().subscribe(observer), disposable ) -> ControlEvent执行subscribe()

    public func subscribe(onNext: ((Element) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)
        -> Disposable {
            let disposable: Disposable
            
            if let disposed = onDisposed {
                disposable = Disposables.create(with: disposed)
            }
            else {
                disposable = Disposables.create()
            }
            
            #if DEBUG
                let synchronizationTracker = SynchronizationTracker()
            #endif
            
            let callStack = Hooks.recordCallStackOnError ? Hooks.customCaptureSubscriptionCallstack() : []
            
            let observer = AnonymousObserver { event in
                
                #if DEBUG
                    synchronizationTracker.register(synchronizationErrorMessage: .default)
                    defer { synchronizationTracker.unregister() }
                #endif
                
                switch event {
                case .next(let value):
                    onNext?(value)
                case .error(let error):
                    if let onError = onError {
                        onError(error)
                    }
                    else {
                        Hooks.defaultErrorHandler(callStack, error)
                    }
                    disposable.dispose()
                case .completed:
                    onCompleted?()
                    disposable.dispose()
                }
            }
            return Disposables.create(
                self.asObservable().subscribe(observer),
                disposable
            )
    }

步骤4:ControlEvent执行subscribe() 来到 ControlEvent结构体
4.1 public init(events: Ev) where Ev.Element == Element { self._events = events.subscribeOn(ConcurrentMainScheduler.instance) } 初始化ControlEvent,传入的source依附在ConcurrentMainScheduler.instance上,赋值给self._events
4.2 ControlEvent实现了 ObservableType协议的subscribe方法
4.3 执行self._events.subscribe(observer),可观察序列执行(2.5传入的序列,但是依附在ConcurrentMainScheduler.instance伞了)subscribe,回到2.2闭包,OK 完美

public struct ControlEvent : ControlEventType {
    public typealias Element = PropertyType

    let _events: Observable

    /// Initializes control event with a observable sequence that represents events.
    ///
    /// - parameter events: Observable sequence that represents events.
    /// - returns: Control event created with a observable sequence of events.
    public init(events: Ev) where Ev.Element == Element {
        self._events = events.subscribeOn(ConcurrentMainScheduler.instance)
    }

    /// Subscribes an observer to control events.
    ///
    /// - parameter observer: Observer to subscribe to events.
    /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control events.
    public func subscribe(_ observer: Observer) -> Disposable where Observer.Element == Element {
        return self._events.subscribe(observer)
    }

    /// - returns: `Observable` interface.
    public func asObservable() -> Observable {
        return self._events
    }

    /// - returns: `ControlEvent` interface.
    public func asControlEvent() -> ControlEvent {
        return self
    }
}

步骤5:点击instance
5.1 MainScheduler.instance 主线程 回到4.1

    public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)

有点问题需要修改

请求数据
(lldb) po self.button.rx.tap
▿ ControlEvent<()>
  ▿ _events : >: 0x60000203c300>

你可能感兴趣的:(RxSwift-tap)