我一直在尝试从Combine中的RxSwift复制flatMapLatest
,我在一些地方读到解决方案是使用.map(...).switchToLatest
我发现两者之间存在一些差异,并且我不确定是否是我的实现/理解出了问题。
在 RxSwift 中,如果上游 observable 发出停止事件(完成或错误),那么在 flatMapLatest
闭包中创建的下游 observable 将继续发出事件,直到它们自己发出停止事件:
let disposeBag = DisposeBag()
func flatMapLatestDemo() {
let mockTrigger = PublishSubject<Void>()
let mockDataTask = PublishSubject<Void>()
mockTrigger
.flatMapLatest { mockDataTask }
.subscribe(onNext: { print("RECEIVED VALUE") })
.disposed(by: disposeBag)
mockTrigger.onNext(())
mockTrigger.onCompleted()
mockDataTask.onNext(()) // -> "RECEIVED VALUE" is printed
}
Combine 中的相同设置的行为方式不同:
var cancellables = Set<AnyCancellable>()
func switchToLatestDemo() {
let mockTrigger = PassthroughSubject<Void, Never>()
let mockDataTask = PassthroughSubject<Void, Never>()
mockTrigger
.map { mockDataTask }
.switchToLatest()
.sink { print("RECEIVED VALUE") }
.store(in: &cancellables)
mockTrigger.send(())
mockTrigger.send(completion: .finished)
mockDataTask.send(()) // -> Nothing is printed, if I uncomment the finished event above then "RECEIVED VALUE" is printed
}
这是故意的吗?如果是这样,我们如何在合并中复制 flatMapLatest
的行为?
如果不是故意的,我猜应该归档雷达?
最佳答案
我已经使用 sergdort 的这个 Swift 实现:
func flatMapLatest<T: Publisher>(_ transform: @escaping (Self.Output) -> T) -> Publishers.SwitchToLatest<T, Publishers.Map<Self, T>> where T.Failure == Self.Failure {
map(transform).switchToLatest()
}
关于swift - 组合中的 switchToLatest 行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58440494/