Combine 响应式编程框架的详细讲解和实现方法

Combine 响应式编程框架的详细讲解和实现方法

什么是 Combine?

Combine 是 Apple 在 iOS 13+ 推出的响应式编程框架 ,用于处理 异步事件流(如网络请求、UI输入、通知等) ,替代回调、KVO 和 NotificationCenter 等传统写法。

示例一:基本使用

swift 复制代码
import Combine

var cancellables = Set<AnyCancellable>()
let publisher = Just("Hello Combine")
publisher
    .sink(receiveCompletion: { completion in
        print("完成状态: \(completion)")
    }, receiveValue: { value in
        print("接收到的值: \(value)")
    })
    .store(in: &cancellables)

示例二:使用 URLSession 数据请求

swift 复制代码
import Foundation
import Combine

struct Post: Codable {
    let id: Int
    let title: String
}

var cancellables = Set<AnyCancellable>()

let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")!

URLSession.shared.dataTaskPublisher(for: url)
    .map(\.data)
    .decode(type: Post.self, decoder: JSONDecoder())
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("请求完成")
        case .failure(let error):
            print("错误: \(error)")
        }
    }, receiveValue: { post in
        print("标题: \(post.title)")
    })
    .store(in: &cancellables)

@Published + ViewModel 绑定(MVVM)

swift 复制代码
class ViewModel: ObservableObject {
    @Published var searchText: String = ""
    @Published var result: String = ""

    private var cancellables = Set<AnyCancellable>()

    init() {
        $searchText
            .debounce(for: .milliseconds(300), scheduler: RunLoop.main)
            .removeDuplicates()
            .map { "结果为:\($0.uppercased())" }
            .assign(to: &$result)
    }
}

绑定在 SwiftUI 中使用:

swift 复制代码
struct ContentView: View {
    @StateObject var viewModel = ViewModel()

    var body: some View {
        VStack {
            TextField("输入", text: $viewModel.searchText)
            Text(viewModel.result)
        }
        .padding()
    }
}

🎯 使用场景总结

🚫 注意事项

  • Combine 仅适用于 iOS 13+、macOS 10.15+****
  • 链式调用中别忘记 .store(in:) 否则会立即释放

🎯 CombineRxSwift 的对比和选择

  • 使用 SwiftUI 构建 App:优先使用 Combine****
  • 使用 UIKit 构建 App:优先使用 RxSwift****
  • 全新项目、仅支持 iOS 13+:Combine 更轻量****
  • 已使用 RxSwift 或需兼容 iOS 12 及更低版本:继续用 RxSwift
相关推荐
星辰即远方9 小时前
天气预报总结
macos·ios·objective-c·cocoa
秋雨梧桐叶落莳11 小时前
计算器仿写总结
学习·macos·ios·objective-c·cocoa
HeiSenBerg11 小时前
Android 网络协议全解析:从 TCP 三次握手到 HTTPS 加密,一篇就够了
面试
乐思智能科技有限公司14 小时前
PLECS软件学习使用(二)直流电机基本系统模型
人工智能·算法·机器学习·面试·职场和发展
GitLqr15 小时前
深度拆解 Dart 事件循环:从面试题看清 Microtask 与 Event Queue 的执行顺序
flutter·面试·dart
haerapi15 小时前
用 System V 共享内存实现本机高速 IPC:从原理到可运行环形队列
面试
菜小麒18 小时前
面试问题-01
面试·职场和发展
朱容zr33313318 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
末代iOS程序员华仔19 小时前
iOS上架海外工具类应用合规指南:避免封号与下架风险
flutter·ios·swift
艾莉丝努力练剑19 小时前
【Linux:动静态库】Linux 动静态库与可执行文件
linux·运维·服务器·学习·面试·文件系统·动静态库