.subscribe 和 .drive 有什么区别

What is the difference between .subscribe and .drive

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

.drive

searchController.rx.text
        .asDriver()
        .drive(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)

.订阅

searchController.rx.text
        .asObservable()
        .subscribe(onNext: { (element) in
            print(element)
        }).disposed(by: disposeBag)

两个块的工作完全相同,使用 .drive 而不是 .subscribe 的目的是什么?在哪种情况下我们应该使用 .drive 而不是 .subscribe ?

任何帮助将不胜感激

DriverObservable 有点不同。来自文档:

Trait that represents observable sequence with following properties:

  • it never fails
  • it delivers events on MainScheduler.instance
  • share(replay: 1, scope: .whileConnected) sharing strategy

我假设 searchController.rx.text 永远不会失败,并且在这种情况下不需要 share

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

  • it delivers events on MainScheduler.instance

而且你可以自己检查一下。在 subscribe 之前插入这个,你的事件将不会在主线程上传递:

.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))

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

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)
    }) 

日志:

driver is on main thread: true

observable is on main thread: false

在什么场景下我们应该使用.drive:

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

Important

Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.