作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 ViewController
,在其中的 init()
我使用 PublishSubject
创建了一个热流。然后,我在 viewDidLoad()
中使用 stream.asObservable()
将流传递到我的 ViewModel
,作为 ViewModel
有其他依赖项,它们是从 View 生成的流,因此它必须等到 View 的绑定(bind)完成才能创建 ViewModel
。创建 ViewModel
后,我将 ViewController
中的一个事件推送到流中,然后期望 ViewModel 通过触发异步请求(也已包装)对事件使用react与 Rx)。
View Controller :
class ExampleViewController: ViewController {
....
private let exampleStream: PublishSubject<Bool>
init() {
self.exampleStream = PublishSubject<Bool>()
}
viewDidLoad() {
self.viewModel = viewModelFactory.create(exampleStream.asObservable())
self.exampleStream.onNext(true)
}
....
}
View 模型:
class ExampleViewModel {
init(stream: Observable<Bool>) {
stream.flatMap { _ in
doSomethingAsyncThatReturnsAnObservable()
}
}
private func doSomethingAsyncThatReturnsAnObservable() -> Observable<CustomObject> { ... }
}
我的问题是,当流中只有一个事件时,doSomethingAsyncThatReturnsAnObservable()
被调用了两次。我已经通过使用 var count = 1; 检查了这个事实。 stream.subscribeNext { _ in print(count++) }
打印 1
。
知道为什么 subscribeNext()
在每个事件上触发一次,而 flatMap()
触发两次吗?
最佳答案
这是因为 flatMap
调用了每个订阅。
如果你希望它被调用一次使用shareReplay(1)
关于swift - flatMap() 在单个事件上调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860272/
我是一名优秀的程序员,十分优秀!