侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用Combine的Just发布一个值并通过sink订阅

2025-12-12 / 0 评论 / 4 阅读

题目

使用Combine的Just发布一个值并通过sink订阅

信息

  • 类型:问答
  • 难度:⭐

考点

Publisher基础, Subscriber基础, Sink操作符

快速回答

使用Combine框架实现以下步骤:

  1. 创建Just发布者发送字符串"Hello Combine"
  2. 通过sink操作符订阅该发布者
  3. 在接收闭包中打印接收到的值
  4. 正确处理订阅生命周期
## 解析

原理说明

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生命周期:
    发布者 → 订阅 → 请求数据 → 发送值 → 发送完成 → 取消