概念
- Combine 中包括
Publisher
在内的一系列角色都使用协议来进行定义,这是 Swift 面向协议编程思想的具体体现。
- Publisher 随着时间推移向一个或多个
Subscriber
发布数据。
- Publisher 最主要的工作其实有两个
Publisher定义
public protocol Publisher {
/// 发送的数据的类型
associatedtype Output
/// Publisher可能产生的错误类型,如果不会产生错误,则使用Never
associatedtype Failure: Error
/// 在调用Publisher的subscribe(_:)方法时方法内部会调用此方法去连接Subscriber
func receive<S>(subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}
extension Publisher {
/// 将指定的Subscriber连接到此Publisher
/// 调用此方法连接而不是receive(subscriber:)
public func subscribe<S>(_ subscriber: S) where S: Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}
解读
-
Output
及Failure
定义了 Publisher 所发布的数据的类型和可能产生的错误类型。
-
subscribe (_:)
方法将 Subscriber 连接到 Publisher。 它规定: Publisher 的Output
必须与 Subscriber 的Input
类型匹配,Failure
也是如此。
内置Publisher
-
Just
:只提供一个结果然后终止的 Publisher ,失败类型为<Never>
。(★)
-
Future
:异步操作的 Publisher ,用一个闭包初始化,该闭包最终解析为单个输出数据或失败完成。(★)
-
Empty
: 一个从不发布任何数据的 Publisher ,并且可以选择立即完成。
-
Fail
:立即使用指定错误终止的 Publisher 。
-
Optional
:如果可选数据具有数据,则 Publisher 仅向每个 Subscriber 发布一次可选数据。
-
Sequence
:发布给定数据序列的 Publisher 。
-
Deferred
:在运行提供的闭包之前等待订阅的 Publisher ,以便为新的 Subscriber 创建 Publisher 。
-
Record
:允许记录一系列Input
和Completion
,供每个 Subscriber 回放。
-
Publishers.Share
:实现者为类的 Publisher ,其行为与其上游 Publisher 相同。
-
Publishers.Multicast
:多播 Publisher ,当有多个 Subscriber,但希望上游 Publisher 的每个数据仅调用一次receive(_ :)
时使用。
-
ObservableObject
:与 SwiftUI 一起使用,符合ObservableObject
协议的对象可以提供 Publisher 。(★)
-
@Published
:属性包装器,用来把一个属性数据转变为 Publisher 。(★)