swift - 如何在Combine中实现正确的switchMap运算符?

标签 swift combine

考虑以下示例:

    cancellable = Just(2).map { x in
        Just(x * x).delay(for: 2.0, scheduler: RunLoop.main)
    }
    .switchToLatest()
    .sink(receiveCompletion: {_ in
        print("completed")
    }, receiveValue: {result in
        print(result)
    })

在这里,我尝试使用组合运算符来模仿著名的 switchMap 运算符的行为。我希望在两秒后完成后得到结果。事实上,既没有结果也没有完成。 这非常糟糕,因为上游已经完成了!

看起来 switchToLatest 会在上游完成后立即取消并忘记完成。 另一方面,如果我用 flatMap 替换它,一切都会按预期工作。

有合适的 switchMap 运算符的好例子吗?

免责声明:我确实了解我的上游完成情况。尽管我希望我的 switchMap 能够工作,无论我的上游是在内部发布商之前还是之后完成的。

最佳答案

您的意思不是以下内容吗(至少,据我所知,它的结果似乎是您所期望的)?

let cancellable = Just(2)
    .map { x in
        Just(x * x)
    }
    .delay(for: 2.0, scheduler: RunLoop.main)
    .switchToLatest()
    .sink(receiveCompletion: {_ in
        print("completed")
    }, receiveValue: {result in
        print(result)
    })

关于swift - 如何在Combine中实现正确的switchMap运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59028791/

相关文章:

ios - 将计时器标签格式化为小时 :minutes:seconds in Swift

swiftui - 当我的 @Published NSManagedObjects 数组更改时,我的 SwiftUI 列表不会更新

swift - Swift Combine 中的双向绑定(bind)

rx-swift - Swift Combine 中 BehaviorRelay 的替代方案

ios - 如何使用 Swift 4/5 扩展多个类

ios - 如何在 Swift 中将图像添加到 ScrollView

swift - 如何在 Swift 中匹配带有重音符号(十六进制代码格式)的字母及其相似的英文字母?

ios - 无法使用 SQL 等条件获取核心数据

ios - 快速组合 : combining three signals into one

swift - 触发 CombineLatest 在 Combine 中传播初始值