.subscribe和.drive之间有什么区别

时间:2018-01-05 13:06:38

标签: reactive-programming rx-swift reactivex

我在Reactive Programming中很新,这是我正在尝试的

.drive

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

.subscribe

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

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:11)

AnimalDriver略有不同。来自文档:

  

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

     
      
  • 它永远不会失败
  •   
  • 它在Observable
  • 上发送活动   
  • MainScheduler.instance分享策略
  •   

我认为share(replay: 1, scope: .whileConnected)永远不会失败,在这种情况下不需要searchController.rx.text

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

  
      
  • 它在share
  • 上发送活动   

你可以自己检查一下。在MainScheduler.instance插入此内容之前,您的活动不会在主要主题上发送:

subscribe

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

.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))

日志:

  

驱动程序在主线程上: true

     

observable在主线程上: false

在哪种情况下我们应该使用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) })

使用用户界面时。为什么?来自文档:

  

重要

     

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