如何在合并中对具有不同故障类型的两个发布者进行FlatMap处理

问题描述 投票:0回答:1

我遵循我的Rx代码中的模式,通常我有一个Observable触发器,我用flatMap为网络请求创建另一个Observable。简化示例:

enum ViewModelError: Error {
  case bang
}

enum DataTaskError: Error {
  case bang
}

func viewModel(trigger: Observable<Void>,
               dataTask: Observable<Result<SomeType, DataTaskError>>) -> Observable<Result<AnotherType, ViewModelError>> {
  let apiResponse = trigger
    .flatMap { dataTask }
}

我遇到了类似的合并问题。我可以将Result用作输出类型,而将Never用作Failure类型,但这感觉是对API的滥用。

func viewModel(trigger: AnyPublisher<Void, Never>,
               dataTask: AnyPublisher<SomeType, DataTaskError>) -> AnyPublisher<AnotherType, ViewModelError> {
  let apiResponse = trigger
    .flatMap { dataTask }
}

我收到编译错误:

Instance method 'flatMap(maxPublishers:_:)' requires the types 'Never' and 'DataTaskError' be equivalent

我可以使用mapError并将这两个错误都转换为Error,但是我需要一个DataTaskError才能创建我的ViewModelError。

这似乎不应该那么困难,并且似乎是一个相当普遍的用例。我可能只是误解了一些基本原理,朝着正确方向的观点将不胜感激。

ios swift frp combine
1个回答
0
投票

[如果您的发布者的失败类型为Never,则可以使用setFailureType(to:)匹配其他发布者的失败类型。请注意,根据文档,仅当故障类型为“从不”时,才可以使用此方法。当您具有实际故障类型时,可以使用setFailureType(to:)转换错误。因此,您可以执行以下操作:

mapError(_:)
© www.soinside.com 2019 - 2024. All rights reserved.