Skip to content

Latest commit

 

History

History
90 lines (68 loc) · 3.89 KB

patterns.adoc

File metadata and controls

90 lines (68 loc) · 3.89 KB

常用模式和方法

本章包括一系列模式和发布者、订阅者和管道的示例。 这些示例旨在说明如何使用 Combine 框架完成各种任务。

错误处理

上述示例都假设,如果发生错误情况,订阅者将处理这些情况。 但是,你并不总是能够控制订阅者的要求——如果你使用 SwiftUI,情况可能如此。 在这些情况下,你需要构建管道,以便输出类型与订阅者的类型匹配。 这意味着你在处理管道内的任何错误。

例如,如果你正在使用 SwiftUI,并且你希望使用 assign 在按钮上设置 isEnabled 属性,则订阅者将有几个要求:

  1. 订阅者应匹配 <Bool, Never> 的类型输出

  2. 应该在主线程调用订阅者

如果发布者抛出一个错误(例如 URLSession.dataTaskPublisher ),你需要构建一个管道来转换输出类型,还需要处理管道内的错误,以匹配错误类型 <Never>

如何处理管道内的错误取决于管道的定义方式。 如果管道设置为返回单个结果并终止, 一个很好的例子就是 [patterns-oneshot-error-handling]。 如果管道被设置为持续更新,则错误处理要复杂一点。 这种情况下的一个很好的例子是 [patterns-continual-error-handling]

和 UIKit 或 AppKit 集成

和 SwiftUI 集成

测试和调试

Combine 中的发布者和订阅者接口是非常易于测试的。

借助 Combine 的可组合性,你可以利用此优势创建或消费符合 Publisher 协议的 API。

publisher protocol 为关键接口,你可以替换任何一方以单独验证你的代码。

例如,如果你的代码专注于通过 Combine 从外部 Web 服务中提供其数据,则可能会使此接口遵循 AnyPublisher<Data, Error>。 然后,你可以使用该接口独立测试管道的任何一侧。

  • 你可以模拟 API 请求和可能响应的数据,包括各种错误条件。 这可以包括使用 JustFail 创建的发布者来返回数据,或者更复杂的使用 Future。 使用这些方案都不需要你进行实际的网络接口调用。

  • 同样,你也可以隔离测试,让发布者进行 API 调用,并验证预期的各种成功和失败条件。