Sink
在 Combine 框架中,sink 是一种常用的订阅方式,用于接收发布者(Publisher)发出的值或者完成事件。sink 可以用于处理 Publisher 发出的元素、处理完成事件,或者捕获错误。
Sink 是 Subscriber 协议的一部分,它不仅能接收 Publisher 发送的值,还可以处理 Publisher 完成或失败的状态。
基本用法
sink 需要传入两个闭包,一个用于接收发出的值,另一个用于处理完成事件(包括成功或错误)。
示例 1:接收值并处理完成事件
import Combine
// 创建一个简单的Publisher
let publisher = [1, 2, 3, 4, 5].publisher
// 使用sink订阅Publisher
let subscription = publisher.sink { completion in
switch completion {
case .finished:
print("Publisher completed successfully.")
case .failure(let error):
print("Publisher failed with error: \(error)")
}
} receiveValue: { value in
print("Received value: \(value)")
}输出:
在这个例子中,sink 用来订阅 publisher 并打印每个收到的值。当 publisher 完成时,sink 会调用 finished 处理闭包。
示例 2:处理错误
Combine 允许你通过 sink 捕获和处理错误。Publisher 可以发出 .failure 类型的事件,sink 会调用相应的错误处理闭包。
输出:
示例 3:简单的 Just Publisher
Just 是一个非常基础的 Publisher,它只会发出一个值并且完成。通过 sink 订阅它,接收该值和完成事件。
输出:
处理 sink 订阅的取消
sink 订阅的取消当你使用 sink 创建一个订阅时,它会返回一个 Cancellable 对象。通过这个对象,你可以取消订阅。
取消订阅后,sink 不会再接收来自 publisher 的值或事件。
sink 的参数说明
sink 的参数说明sink 方法有两种形式:
接收值和完成事件:
receiveCompletion: 接收Publisher完成状态,可能是.finished或.failure(error)receiveValue: 用于处理Publisher发出的每个值
仅接收值:
这种形式只会处理接收到的值,忽略完成事件和错误。
使用场景
简单订阅:
sink适用于快速的、简单的订阅需求,特别是当你需要处理异步任务的结果时。UI更新: 常用于将数据从
Publisher(如网络请求、数据库查询等)传递到 UI 层,自动更新界面。错误处理:
sink提供了一个方便的方式来捕获和处理流中的错误。
总结
sink是Combine中非常重要的一个订阅工具,它可以接收Publisher发出的值,并处理完成和错误事件。sink返回一个Cancellable对象,允许你在适当的时候取消订阅。sink可以有两种形式:一种是同时处理接收到的值和完成事件,另一种只接收值。
Last updated