.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
?
任何帮助将不胜感激
Driver
与 Observable
有点不同。来自文档:
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.
我是响应式编程的新手,这就是我正在尝试的
.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
?
任何帮助将不胜感激
Driver
与 Observable
有点不同。来自文档:
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.