Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
1. 发布者和订阅者的生命周期
订阅者和发布者以明确定义的顺序进行通信,因此使得它们具有从开始到结束的生命周期:
- 当调用
.subscribe(_: Subscriber)
时,订阅者被连接到了发布者publisher。 - publisher发布者随后调用
receive(subscription: Subscription)
来确认该订阅。 - 在订阅被确认后,订阅者请求 N 个值,此时调用
request(_: Demand)
。 - publisher发布者可能随后(当它有值时)发送 N 个或者更少的值,通过调用
receive(_: Input)
。 发布者不会发送超过需求量的值。 - 订阅确认后的任何时间,订阅者都可能调用
.cancel()
来发送 cancellation
发布者可以选择性地发送 completion:receive(completion:)
。 完成可以是正常终止,也可以是通过.failure
完成,可选地传递一个错误类型。 已取消的管道不会发送任何完成事件。
在上述图表中包含了一组堆积起来的弹珠图, 这是为了突出 Combine 的弹珠图在管道的整体生命周期中的重点。 通常,图表推断所有的连接配置都已完成并已发送了数据请求。 Combine 的弹珠图的核心是从请求数据到触发任何完成或取消之间的一系列事件。
2. publisher发布者
发布者是数据的提供者。 当订阅者请求数据时, publisher protocol 有严格的返回值类型约定,并有一系列明确的完成信号可能会终止它。
你可以从 Just 和 Future 开始使用发布者,它们分别作为单一数据源和异步函数来使用。
当订阅者发出请求时,许多发布者会立即提供数据。 在某些情况下,发布者可能有一个单独的机制,使其能够在订阅后返回数据。 这是由协议 ConnectablePublisher 来约定实现的。 遵循 ConnectablePublisher
的发布者将有一个额外的机制,在订阅者发出请求后才启动数据流。 这可能是对发布者单独的调用 .connect()
来完成。 另一种可能是 .autoconnect()
,一旦订阅者请求,它将立即启动数据流。
Combine 提供了一些额外的便捷的发布者:
- Just
- Future
- Deferred
- Empty
- Sequence
- Fail
- Record
- Share
- Multicast
- ObservableObject
- @Published
Combine 之外的一些 Apple API 也提供发布者。
- SwiftUI 使用
@Published
和@ObservedObject
属性包装,由 Combine 提供,含蓄地创建了一个发布者,用来支持它的声明式 UI 的机制。
Foundation
- URLSession.dataTaskPublisher
- .publisher on KVO instance
- NotificationCenter
- Timer
- Result
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes