什么是 Combine,为什么需要它?
Combine 是 Apple 于 2019 年随 iOS 13 推出的响应式编程框架。它提供了声明式的 Swift API,用于处理随时间变化的事件。Combine 允许将异步事件处理操作符组合成数据处理管道(pipeline)。
Combine 的主要任务是简化异步操作的处理:网络请求、通知、KVO(键值观察)、定时器、委托和回调函数。Combine 没有采用分散的机制,而是基于 Publisher(发布者)和 Subscriber(订阅者)提供了统一的接口。
关键概念:
- Publisher — 数据源,可以发送值并完成(成功或出错)。
- Subscriber — 数据接收者,响应来自 Publisher 的事件。
- Operator — 转换、过滤或组合数据流的方法。
- Subscription — Publisher 和 Subscriber 之间的连接,管理数据流。
Combine 与 SwiftUI 和 Foundation 紧密集成,使其成为现代 iOS 应用程序不可或缺的一部分。
安装
Combine 是 Apple 的内置框架。使用它无需通过 CocoaPods、SPM 或 Carthage 安装额外的包。它从 iOS 13、macOS 10.15、tvOS 13 和 watchOS 6 开始可用。
要开始使用 Combine,只需在 Swift 文件中导入它:
import Combine如果您使用 Swift Package Manager 管理依赖项,Combine 已包含在标准库中。对于支持较旧操作系统版本的项目,可以使用 OpenCombine — Combine 的开源实现。
通过 SPM 安装 OpenCombine:
// 在 Package.swift 中dependencies: [ .package(url: "https://github.com/CombineOpenSource/Combine.git", from: "0.5.0")]快速入门与代码示例
考虑一个最简单的示例:从数组创建 Publisher 并订阅它。
import Combine
// 1. 从数组创建 Publisherlet publisher = [1, 2, 3, 4, 5].publisher
// 2. 创建 Subscriberlet subscriber = Subscribers.Sink<Int, Never>( receiveCompletion: { completion in print("完成: \\(completion)") }, receiveValue: { value in print("收到值: \\(value)") })
// 3. 订阅publisher.subscribe(subscriber)控制台输出:
收到值: 1收到值: 2收到值: 3收到值: 4收到值: 5完成: finished使用 sink 操作符的更惯用方式:
import Combine
let cancellable = [1, 2, 3, 4, 5].publisher .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) })请注意:sink 返回一个 AnyCancellable。需要保留它,否则订阅将在离开作用域后立即被取消。
主要方法/函数
1. sink(receiveCompletion:receiveValue:)
功能: 创建一个订阅者,接收来自 Publisher 的所有值和完成事件。这是订阅流的最简单方式。
参数:
receiveCompletion— 完成时(成功或出错)调用的闭包。接受Subscribers.Completion<Failure>。receiveValue— 每次收到新值时调用的闭包。
示例:
let cancellable = Just("Hell