我在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
?
任何帮助将不胜感激
答案 0 :(得分:11)
Animal
与Driver
略有不同。来自文档:
表示具有以下属性的可观察序列的特征:
- 它永远不会失败
- 它在
上发送活动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派生的类或那些 涉及以任何方式操纵您的应用程序的用户界面。