题目
使用Combine的Just发布一个值并通过sink订阅
信息
- 类型:问答
- 难度:⭐
考点
Publisher基础, Subscriber基础, Sink操作符
快速回答
使用Combine框架实现以下步骤:
- 创建
Just发布者发送字符串"Hello Combine" - 通过
sink操作符订阅该发布者 - 在接收闭包中打印接收到的值
- 正确处理订阅生命周期
原理说明
Combine是Apple的响应式编程框架,核心包含三个组件:
- Publisher:数据生产者(如
Just,发送单个值后结束) - Subscriber:数据消费者(如
sink创建的订阅者) - Subscription:管理发布者和订阅者之间的连接
代码示例
import Combine
// 1. 创建发布者
let publisher = Just("Hello Combine")
// 2. 订阅并处理数据
let cancellable = publisher.sink(
receiveCompletion: { completion in
switch completion {
case .finished:
print("数据流完成")
case .failure(let error):
print("错误: ", error)
}
},
receiveValue: { value in
print("收到值: ", value) // 输出: 收到值: Hello Combine
}
)
// 3. 取消订阅(实际根据生命周期管理)
// cancellable.cancel()最佳实践
- 始终存储返回的
AnyCancellable对象,否则订阅会立即被销毁 - 在类中使用时,将
cancellable存储在属性集合中:private var cancellables = Set<AnyCancellable>() - 对于
Just这类单次发布者,完成事件会自动触发
常见错误
- 忽略返回值:未存储
AnyCancellable导致订阅立即取消publisher.sink {...} // 错误!缺少存储 - 线程问题:未使用
receive(on:)指定主线程更新UI - 内存泄漏:在闭包内错误使用
[unowned self]导致崩溃
扩展知识
Just是内置发布者,适用于:- 单个值的同步发布
- 错误类型为
Never(不会抛出错误)
sink的两种闭包:receiveValue:处理数据(必需)receiveCompletion:处理完成/错误(可选)
- Combine生命周期:
发布者 → 订阅 → 请求数据 → 发送值 → 发送完成 → 取消