题目
解释Combine框架中的Publisher和Subscriber及其协作关系
信息
- 类型:问答
- 难度:⭐
考点
Publisher概念,Subscriber概念,订阅机制
快速回答
在Combine框架中:
- Publisher:声明数据流的协议,可发送值、错误或完成事件
- Subscriber:接收数据的协议,包含接收数据的三个核心方法
- 协作关系:通过
subscribe(_:)建立连接,形成响应式数据流
1. 核心概念
Publisher:
- 数据生产者协议(
protocol Publisher) - 可发出三种事件:值(Output)、错误(Failure)、完成(Completion)
- 示例:
Just,Future,PassthroughSubject
Subscriber:
- 数据消费者协议(
protocol Subscriber) - 必须实现三个方法:
receive(subscription: Subscription):建立连接receive(_ input: Input) -> Subscribers.Demand:处理数据receive(completion: Subscribers.Completion<Failure>):处理结束
2. 协作流程
典型工作流程:
- 创建Publisher(如
PassthroughSubject) - 创建Subscriber(如
sink或assign) - 通过
subscribe方法建立关联 - Publisher通过Subscription管理数据流
3. 代码示例
import Combine
// 1. 创建Publisher
let publisher = PassthroughSubject<String, Never>()
// 2. 创建Subscriber
let subscriber = publisher.sink(
receiveCompletion: { print("完成: \($0)") },
receiveValue: { print("收到值: \($0)") }
)
// 3. 发送数据
publisher.send("Hello")
publisher.send("Combine!")
publisher.send(completion: .finished)
/* 输出:
收到值: Hello
收到值: Combine!
完成: finished
*/4. 原理说明
- 订阅机制:当调用
subscribe(_:)时,Publisher会调用Subscriber的receive(subscription:)方法,传递Subscription对象 - 背压管理:Subscriber通过
Demand控制数据流速 - 生命周期:当发送完成/错误事件或Subscription被取消时,数据流终止
5. 最佳实践
- 优先使用高阶操作符(如
sink,assign)简化Subscriber创建 - 及时存储
AnyCancellable避免内存泄漏 - 使用
PassthroughSubject作为自定义事件触发器
6. 常见错误
- 忘记存储
AnyCancellable导致订阅立即释放 - 未处理错误事件导致崩溃(需指定
Failure类型) - 在错误线程操作UI(应使用
receive(on:)切换到主线程)
7. 扩展知识
- 操作符(Operators):
map/filter等转换Publisher输出 - Subject:既是Publisher又是Subscriber的特殊类型(如
CurrentValueSubject) - 内存管理:订阅返回值
AnyCancellable必须强引用,否则流会立即终止