Skip to content

combine

[Using Combine](https://heckj.github.io/swiftui-notes/index_zh-CN.html

关于 combine

Combine 是 Apple 用来实现函数响应式编程的库, 类似于 RxSwift

使用场景:

当你想要设置对各种输入做出反应时,Combine 最合适, 用户界面也非常适合这种模式。任何异步操作序列都可以被作为管道,尤其是当每个步骤的结果流向下一步时。 此类示例可能是一系列网络服务请求,然后对结果进行解码。

Publisher and Subscriber

发布者(Publisher): 当描述发布者时,应该用两种相关的类型来描述它:一种用于输出,一种用于失败。

image.png

订阅者(Subscriber):

订阅者负责请求数据并接受发布者提供的数据(和可能的失败)。 订阅者同样被描述为两种关联类型,一种用于输入,一种用于失败。 订阅者发起数据请求,并控制它接收的数据量。 它可以被认为是在 Combine 中起“驱动作用”的,因为如果没有订阅者,其他组件将保持闲置状态,没有数据会流动起来。

发布者和订阅者是相互连接的,它们构成了 Combine 的核心。 当你将订阅者连接到发布者时,两种类型都必须匹配:发布者的输出和订阅者的输入以及它们的失败类型。 将其可视化的一种方法是对两种类型进行一系列并行操作,其中两种类型都需要匹配才能将组件插入在一起。

操作符(operator):

用于转换值或类型 - 输出和失败类型都可以。操作符还可以拆分或复制流,或将流合并在一起。 操作符必须始终按输出/失败这样的类型组合对齐。 编译器将强制执行匹配类型,因此类型错误将导致编译器错误(如果幸运的话,会有一个有用的 fixit 片段建议给你解决方案)。

在 Combine 框架的第一个版本中( iOS 13.3 和 macOS 10.15.2 之前),当订阅者请求具有特定需求的数据时,该请求是异步发生的。 由于此过程中是充当触发器的订阅者,去触发其连接的操作符,并最终触发发布者去请求数据,因此这意味着在某些情况下存在数据丢失的可能性。 因此,在 iOS 13.3 和以后的 Combine 版本中,请求的过程被改成了同步/阻塞线程的。 实际上,这意味着在发布者收到发送数据的请求之前,你可以更确信后序的管道已经完全准备好处理接下来的数据了。

Combine 管道的生命周期

  1. 当调用 .subscribe(_: Subscriber) 时,订阅者被连接到了发布者。
  2. 发布者随后调用 receive(subscription: Subscription) 来确认该订阅
  3. 在订阅被确认后,订阅者请求 N 个值,此时调用 request(_: Demand)