.subscribe和.drive有什么区别

Tro*_*yer 8 reactive-programming rx-swift reactivex

我是反应式编程的新手,这是我正在尝试的

.驾驶

searchController.rx.text
        .asDriver()
        .drive(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

.订阅

searchController.rx.text
        .asObservable()
        .subscribe(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

这两个区块的工作完全一样,什么是使用的目的.drive.subscribe?在这情况下,我们应该使用.drive.subscribe

任何帮助将不胜感激

iWh*_*Buy 17

Driver有点不同Observable.来自文档:

表示具有以下属性的可观察序列的特征:

  • 它永远不会失败
  • 它提供活动 MainScheduler.instance
  • share(replay: 1, scope: .whileConnected) 分享策略

我认为searchController.rx.text永远不会失败,share在这种情况下不需要.

所以我们只有一点让你的情况与众不同:

  • 它提供活动 MainScheduler.instance

你可以自己检查一下.在subscribe插入此内容之前,您的事件将不会在主线程上传递:

.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
Run Code Online (Sandbox Code Playgroud)

这就是我在我的代码中检查它的方式:

something
    .asObservable()
    .observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
    .subscribe(onNext: { _ in
        print("observable is on main thread: ", Thread.isMainThread)
    })

something
    .asDriver()
    .drive(onNext: { _ in
        print("driver is on main thread: ", Thread.isMainThread)
    }) 
Run Code Online (Sandbox Code Playgroud)

日志:

驱动程序在主线程上:true

observable在主线程上:false

在哪种情况下我们应该使用.drive:

使用UI时.为什么?来自文档:

重要

除非另有说明,否则仅从应用程序的主线程或主调度队列中使用UIKit类.此限制特别适用于从UIResponder派生的类或涉及以任何方式操纵应用程序的用户界面的类.