swift - 组合中的 switchToLatest 行为不符合预期

标签 swift combine

我一直在尝试从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/

相关文章:

ios - 二元运算符 '|' 不能应用于两个 UIViewAutoresizing 操作数

swift - 如何格式化我的 plist 数组以使其在 tablecell 中看起来不错?

swift - 重复数组的特定项目

ios - 观察绑定(bind)或状态变量

swift - 如何使用较旧的 iOS 支持向自定义类添加 Combine 兼容性?

swift - 'Publishers.Once' 的替代方案是什么?

ios - 忽略全局范围的类型方法?

arrays - 将具有特定类型的集合转换为数组 - Swift 2.3

Swift Combine : One publisher consumes another, 如何让两个流都退出