【问题标题】:Alamofire + Combine publishDecodable to FutureAlamofire + 结合 publishDecodable 到 Future
【发布时间】:2020-07-02 09:52:22
【问题描述】:

所以,据我所知,在 Alamofire 和 Combine 上,我们现在可以做到这一点:

AF.request(...).publishDecodable(type: DecodableType.self)

如果我们想将错误映射到 AFError 以外的自定义类型,这意味着我们最终会得到这样的方法:

enum DifferentError: Error {
    case alamofire(wrapped: AFError)
    case malformedURL

func requestSomeStuff(url: String) -> AnyPublisher<DecodableType, DifferentError> {
    
    guard self.validateUrl(url) else {
        return Fail(error: DifferentError.malformedURL).eraseToAnyPublisher()
    }

    return AF.request(...)
             .publishDecodable(type: DecodableType.self)
             .value()
             .mapError { DifferentError.alamofire(wrapped: $0) }
             .eraseToAnyPublisher()
}

Fail 发布者对我来说似乎不对;我在这里遗漏了什么,或者这是正确的做法吗?

这应该返回一个Future 吗?可以将publishDecodable 映射到Future 吗?

【问题讨论】:

  • 为什么你觉得它必须是FutureFuture 实际上只是一个包装发布者,它围绕着未来可能通过异步操作产生的一些价值。在这里,如果someKindOfValidation 是同步的,那么Fail 会立即向下游返回失败,而不是AF 发布者链。取决于你说“做错误映射”时想要实现的目标
  • 更新了问题以阐明“做错误映射”部分。认为它应该是Future,因为它应该产生一个值或失败,并且它可能会因.fail(Error) 而不是Fail 发布者而失败。不过,这可能完全不是问题!
  • 什么是.fail?你的意思是.failure(error) 承诺Future?它实际上会达到相同的效果。调用者不知道也不关心这是什么发布者 - 就它而言,它是 AnyPublisherFutureFail 都达到了相同的结果。
  • 是的,我的意思是.failure,抱歉。好吧,如果该方法返回Future&lt;DecodableType, DifferentError&gt;,调用者就会知道并关心该方法只能发布一个值。需要明确的是,这里的意图不是将 Fail 变成 Future 的承诺 .failure(Error),而是让整个方法返回 Future,同时仍然使用来自 Alamofire 的 publishDecodable。跨度>
  • 你可以返回一个Future,当然——但目前——通常从我所见——你的API边界被定义为AnyPublisher。换句话说,除了输出和失败类型之外,订阅者不应该关心他们订阅的发布者。还有一个需求的概念,订阅者只能要求一个值。

标签: swift alamofire combine


【解决方案1】:

我建议您将 URL 验证移到 Alamofire 的请求管道中,以便任何错误都通过 Alamofire,而不是在 Combine 级别执行此操作(您已经获得了帮助),而不是通过 Combine 获得单独的流。 这样您就可以利用 Alamofire 的功能,例如自动重试,同时简化您的代码。为此,我建议采用URLConvertibleURLRequestConvertible 协议。当 Alamofire 将值转换为 URLs 或 URLRequests 时,这些协议使您有机会产生错误。例如,使用简单的 ValidatedURL 类型,您可以将您的验证内联:

struct ValidatedURL: URLConvertible {
    let url: URL

    func asURL() throws -> URL {
        guard validate(url) else { throw DifferentError.malformedURL }

        return url
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多