RxSwift Scheduler调度环境

RxSwift Scheduler调度环境

调度环境的初探

DispatchQueue.global().async {
   self.button.rx.tap.subscribe(onNext: { () in
        print("订阅回调线程 \(Thread.current)") // 主线程
   }).disposed(by: self.disposeBag)
}

上面按钮的点击事件回调线程为主线程,这一过程是如何实现的呢?明明是在子线程中订阅的。且看源码分析。
在这里插入图片描述
高清无码Xmind下载地址

public var tap: ControlEvent<Void> {
    return controlEvent(.touchUpInside)
}
public func controlEvent(_ controlEvents: UIControl.Event) -> ControlEvent<()> {
    let source: Observable<Void> = 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)
}

1、self.button.rx.tap创建了一个序列返回的是ControlEvent结构体,它实现了ControlEventType协议,而ControlEventType又实现了ObservableType协议。在controlEvent方法中并没有对线程进行过操作

2、而MainScheduler.ensureRunningOnMainThread()只是判断当前执行的是否是主线程

3、下面来看ControlEvent的初始化方法

public init<Ev: ObservableType>(events: Ev) where Ev.Element == Element {
    self._events = events.subscribeOn(ConcurrentMainScheduler.instance)
}

由源码可知,唯一有线程操作的地方是ConcurrentMainScheduler.instance

private init(mainScheduler: MainScheduler) {
    self._mainQueue = DispatchQueue.main
    self._mainScheduler = mainScheduler
}
public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)

在ConcurrentMainScheduler初始化方法中默认创建了一个主队列

4、这里events = source, 由controlEvent方法中创建传递过来的,events.subscribeOn()就决定了订阅在主线程中了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值