从响应式编程到 Combine 实践

iOS进阶1-combine Combine 是 Apple 在 WWDC 2019 上推出的一个声明式编程框架,它基于响应式编程 (Reactive Programming)思想,用于处理应用中的异步事件流,比如网络请求、数据存储、UI 交互、定时器等。其核心目标是简化异步代码的编写、提高可读性和可维护性,并提供一种统一的方式来处理各种事件流。Combine 是 iOS 开发中处理异步事件和状态管理的强大工具,其核心是 “发布者 - 订阅者 - 运算符” 模型。 阅读详情

大约一年前,Resso 接入了 Combine,利用响应式编程简化了代码逻辑,也积累了很多实践经验。本文会从响应式编程的基本思想并逐步深入介绍 Combine 的概念与最佳实践, 希望能帮助更多的同学顺利上手并实践响应式编程,少踩坑。

等等,Resso 是什么?Resso 来源于 Resonate(共鸣),是字节跳动推出的一个社交音乐流媒体平台,专为下一代音乐发烧友设计,使他们能够通过对音乐的热爱来表达和与他人建立联系。

书回正文,所谓的响应式编程到底是什么呢?

熟悉 Combine 的同学可以直接跳到实践建议部分。​

响应式编程

维基百科对响应式编程的定义是:

  • 在计算中,响应式编程是一种面向数据流和变化传播的声明式编程范式。

虽然定义中每个字都认识,但连起来却十分费解。我们可以把定义中的内容分开来理解,逐个击破。首先,让我们来看下声明式编程。

声明式编程

声明式和指令式编程是常见的编程范式。在指令式编程中,开发者通过组合运算、循环、条件等语句让计算机执行程序。声明式与指令式正相反,如果说指令式像是告诉计算机 How to do,而声明式则是告诉计算机 What to do。其实大家都接触过声明式编程,但在编码时并不会意识到。各类 DSL 和函数式编程都属于声明式编程的范畴。

举个例子,假设我们想要获取一个整形数组里的所有奇数。按照指令式的逻辑,我们需要把过程拆解为一步一步的语句:

  • 遍历数组中的所有元素。
  • 判断是否为奇数。
  • 如果是的话,加入到结果中。继续遍历。
var results = [Int]()
for num in values {
    if num %2 != 0 {
        results.append(num)
    }
}

如果按声明式编程来,我们的想法可能是“过滤出所有奇数”,对应的代码就十分直观:

var results = values.filter { $0 % 2 != 0 }

可见上述两种编程方式有着明显的区别:

  • 指令式编程:描述过程(How),计算机直接执行并得结果。
  • 声明式编程:描述结果(What),让计算机为我们组织出具体过程,最后得到被描述的结果。

“面向数据流和变化传播”

用说人话的方式解释,面向数据流和变化传播是响应未来发生的事件流。

  1. 事件发布:某个操作发布了事件A​,事件A​ 可以携带一个可选的数据B 。
  2. 操作变形:事件A​ 与数据B​ 经过一个或多个的操作发生了变化,最终得到事件A'​ 与数据B'。
  3. 订阅使用:在消费端,有一个或多个订阅者来消费处理后的A'​ 和B',并进一步驱动程序其他部分 (如 UI )

在这个流程中,无数的事件组成了事件流,订阅者不断接受到新的事件并作出响应。

至此,我们对响应式编程的定义有了初步的理解,即以声明的方式响应未来发生的事件流。在实际编码中,很多优秀的三方库对这套机制进一步抽象,为开发者提供了功能各异的接口。在 iOS 开发中,有三种主流的响应式“流派“。

响应式流派

  • ReactiveX:RxSwift
  • Reactive Streams:Combine
  • Reactive*:ReactiveCocoa / ReactiveSwift /ReactiveObjc

这三个流派分别是 ReactiveX、Reactive Streams 和 Reactive*。ReactiveX 接下来会详细介绍。Reactive Stream 旨在定义一套非阻塞式异步事件流处理标准,Combine 选择了它作为实现的规范。以 ReactiveCocoa 为代表的 Reactive* 在 Objective-C 时代曾非常流行,但随着 Swift 崛起,更多开发者选择了 RxSwift 或 Combine,导致 Reactive* 整体热度下降不少。

ReactiveX (Reactive Extension)

ReactiveX 最初是微软在 .NET 上实现的一个响应式的拓展。它的接口命名并不直观,如 Observable (可观测的) 和 Observer(观测者)。ReactiveX 的优势在于创新地融入了许多函数式编程的概念,使得整个事件流的变形非常灵活。这个易用且强大的概念迅速被各个语言的开发者青睐,因此 ReactiveX 在很多语言都有对应版本的实现(如 RxJS,RxJava,RxSwift),都非常流行。Resso 的 Android 团队就在重度使用 RxJava。

为何选择 Combine

Combine 是 Apple 在 2019 年推出的一个类似 RxSwift 的异步事件处理框架。

通过对事件处理的操作进行组合 (combine) ,来对异步事件进行自定义处理 (这也正是 Combine 框架的名字的由来)。Combine 提供了一组声明式的 Swift API,来处理随时间变化的值。这些值可以代表用户界面的事件,网络的响应,计划好的事件,或者很多其他类型的异步数据。

Resso iOS 团队也曾短暂尝试过 RxSwift,但在仔细考察 Combine 后,发现 Combine 无论是在性能、调试便捷程度上都优于 RxSwift,此外还有内置框架和 SwiftUI 官配的特殊优势,受其多方面优势的吸引,我们全面切换到了 Combine。

Combine 的优势

相较于 RxSwift,Combine 有很多优势:

  • Apple 出品
  • 内置在系统中,对 App 包体积无影响
  • 性能更好
  • Debug 更便捷
  • SwiftUI 官配

性能优势

Combine 的各项操作相较 RxSwift 有 30% 多的性能提升。

Reference: Combine vs. RxSwift Performance Benchmark Test Suite

Debug 优势

由于 Combine 是一方库,在 Xcode 中开启了 Show stack frames without debug symbols and between libraries 选项后,无效的堆栈可以大幅的减少,提升了 Debug 效率。

// 在 GlobalQueue 中接受并答应出数组中的值
[1, 2, 3, 4].publisher
    .receive(on: DispatchQueue.global())
    .sink { value in
        print(value)
    }

Combine 接口

上文提到,Combine 的接口是基于 Reactive Streams Spec 实现的,Reactive Streams 中已经定义好

【iOS面试题五】函数响应式编程 概念、RAC、RxSwift和Combine 阅读详情

相关推荐

Unity响应式编程实战:用UniRx重构UI与数据绑定

响应式编程是一种基于数据流和变化传播的编程范式,其核心原理是通过观察者模式将数据变化自动推送给订阅者,实现状态同步的自动化。这一技术价值在于能显著降低代码耦合度,提升可维护性,尤其适用于处理复杂的异步事件和状态管理。在游戏开发领域,响应式编程广泛应用于UI数据绑定、用户输入处理、游戏状态同步等场景。本文聚焦于Unity引擎中的UniRx库,深入解析如何利用其事件流(Observable)、观察者(Observer)和操作符(Operators)三大核心概念,构建高效解耦的响应式系统。通过实战案例,展示了如何

weixin_29008055的博客 283

【iOS面试题四】SwiftUI与Combine编程

简介、你好,SwiftUI、数据状态和绑定、真实世界的SwiftUI、Combine和异步编程Publisher和常见Operator、响应式编程边界、SwiftUI架构、用户体验和布局进阶

tospery的专栏 2429

【iOS面试题六】知识要点

Darwin内核、核心框架层、应用框架层、应用层(UIKit)、应用层(SwiftUI)和扩展

tospery的专栏 772

Combine 教程 · 第一章:认识 Combine(SwiftUI 开发者专属视角)

我们将深入讲解 Combine 的三大主角,理解它们的生命周期、如何组合与清理订阅,结合更多小案例。• Combine 是 Apple 原生的响应式框架,SwiftUI 的天然拍档。• SwiftUI 中 @Published、$var 背后都是 Combine。• SwiftUI 的 View 会自动监听 Combine 的更新来重绘界面。• @Published 背后就是 Combine 的 Publisher。• @ObservedObject 是 Combine 的桥梁。

leonyie2022的博客 1254

Combine与Swift并发模型的未来:是互补还是替代?

本文探讨了Combine与Swift并发模型在异步编程中的互补与替代关系。Combine擅长处理持续事件流,如UI交互和实时数据,而Swift结构化并发更适合离散异步任务,如网络请求和并行计算。文章分析了两种技术的核心差异、应用场景及未来演进方向,为开发者提供了技术选型和迁移策略的实用建议。

weixin_29011239的博客 425

Combine与HealthKit:移动开发健康应用集成

本文旨在为iOS开发者提供Combine与HealthKit集成的全面指南,涵盖从基础概念到高级应用场景的全套解决方案。HealthKit数据模型的核心概念Combine在健康数据处理中的优势实现安全高效的数据同步策略处理健康数据的特殊考量文章首先介绍HealthKit和Combine的基础知识,然后深入集成方案,接着通过实际案例展示完整实现,最后讨论高级主题和最佳实践。HealthKit:苹果提供的健康数据管理框架Combine:苹果的响应式编程框架。

移动开发前沿的博客 767

11、利用 Combine 进行表单验证与响应式编程

本文介绍了如何使用 Apple 的 Combine 框架进行表单验证和响应式编程。通过实际案例(如披萨订购系统)展示了 Combine 的核心概念,包括发布者(Publishers)、订阅者(Subscribers)和操作符(Operators)的使用方式。文章还涵盖了 Combine 的最佳实践、注意事项以及其与 SwiftUI 的集成优势,帮助开发者更高效地处理异步事件并构建稳定的应用程序。

uran的专栏 66

2、SwiftUI:开发新起点

本文介绍了苹果推出的全新UI框架SwiftUI,探讨了其设计理念和核心特性,如声明式编程、内置状态管理、组合优于继承等。通过一个简单的‘Hello World’示例,展示了如何利用SwiftUI快速构建交互式界面,并深入讲解了如何通过状态管理实现UI与数据模型的同步。文章还总结了SwiftUI的主要优势,包括降低开发难度、提升软件质量和开发效率等,为开发者开启SwiftUI学习之旅提供了全面指导。

sugar的博客 59

iOS中的依赖注入与Combine框架整合

本文旨在解决iOS开发中依赖管理与响应式编程的整合难题。通过深入剖析依赖注入的设计原则与Combine框架的核心机制,提供一套完整的技术方案,帮助开发者构建松耦合、可测试的响应式应用。内容涵盖基础概念、核心原理、代码实现、实战案例及最佳实践,适用于中高级iOS开发者及架构师。背景介绍:明确技术目标与核心概念核心概念与联系:解析依赖注入与Combine的原理及整合点依赖注入实现模式:基于Swift的三种注入方式详解Combine框架核心机制:Publisher/Subscriber模型与异步数据流处理。

移动开发前沿的博客 964

剖析移动开发领域Combine的底层逻辑

在移动开发中,异步编程(如网络请求、用户点击事件、定时器)是绕不开的"麻烦制造者":回调地狱、内存泄漏、线程混乱等问题让开发者苦不堪言。苹果在2019年WWDC推出的Combine框架,正是为了解决这些痛点。本文将聚焦Combine的底层运行机制,覆盖核心概念、数据流传递规则、关键设计模式(如观察者模式+函数式编程),以及实际开发中的落地技巧。本文将按照"生活故事→核心概念→底层逻辑→代码实战→场景应用"的递进结构展开。通过"送牛奶"的生活化案例类比,先建立直观认知;再拆解Combine的5大核心组件;

移动开发前沿的博客 1112

移动开发必备:Combine框架从入门到精通

在移动开发中,异步操作(如网络请求、用户输入、定时器)是绕不开的“麻烦事”。传统的闭包回调、Delegate模式容易导致代码嵌套(“回调地狱”),RxSwift等第三方框架虽强大但学习成本高且依赖外部库。2019年WWDC,Apple推出了Combine——官方原生响应式编程框架,专为Swift设计,完美适配iOS/macOS/watchOS/tvOS,旨在用统一的语法简化异步编程。

移动开发前沿的博客 1072

移动开发:利用Combine实现数据绑定

在移动开发中,数据绑定是一项非常重要的技术,它可以让界面和数据之间建立起一种自动更新的联系,提高开发效率和代码的可维护性。而Combine是苹果推出的用于响应式编程的框架,它为实现数据绑定提供了强大的工具。本文的目的就是详细介绍如何在移动开发中利用Combine来实现数据绑定,范围主要涵盖iOS开发平台。本文首先会介绍相关的核心概念,包括Combine和数据绑定,以及它们之间的关系。接着会阐述利用Combine实现数据绑定的核心算法原理和具体操作步骤,通过数学模型和公式进一步讲解。

移动开发前沿的博客 697

18、Combine与异步编程:调度、操作符及异步处理实践

本文深入探讨了使用Combine框架进行异步编程的核心概念和实践方法,包括调度操作符如debounce、throttle和delay的使用,如何通过异步处理提升应用性能和响应性。文章还介绍了异步编程的基础知识、与其他API(如URLSession和Firebase)的集成方式,以及Swift中引入的async/await语法带来的简化效果。此外,通过对比同步与异步实现三明治制作的示例,展示了异步编程的优势和挑战。最后,文章总结了异步编程的最佳实践,包括错误处理、资源管理,并提供了不同异步实现方式的适用场景,

sugar的博客 98

Unity详细介绍说明限制Unity帧率的方式

在Unity开发中,帧率(FPS,Frames per Second)是一个非常重要的表现标准,它直接影响了游戏运行的流畅度。在某些应用场景里,我们可能需要手动限制帧率。限制帧率可以减少电脑的CPU和GPU负载,使运行更加稳定,同时对于移动设备来说还能有效降低电量消耗。下面就详细介绍几种限制Unity中帧率的方式。

zjw1349547081的专栏 5437

图像去噪实战:Noise2Noise与Noise2Void在医学影像中的应用(附代码)

本文深入探讨了Noise2Noise与Noise2Void在医学影像去噪中的革命性应用,通过自监督学习技术有效解决临床数据配对难题。文章提供详细的代码实现和临床部署方案,展示如何提升低剂量CT、MRI等影像的诊断质量,特别适用于辐射敏感场景和急诊快速处理。

weixin_29092579的博客 241

Python遥感图像处理指南(2)-卫星影像分析MNDWI提取

在第一篇文章中,我们使用了我们导入的软件包中已定义的函数,如 rasterio 中的 open 和 read 以及 matplotlib 中的 imshow。现在,我们可以编写自己的函数了。函数是一段代码,它接收一些参数作为输入并返回输出(经过一些计算),可以在代码中多次重复使用,也可以被其他代码重用。在 Python 中定义一个新函数非常简单。return v在此语法示例中,arg1和arg2强制参数,应该传递给函数,否则会引发错误,而arg3是一个可选参数,如果是,则假定默认值 1从函数调用中省略。

gis收藏家的博客 1576

刚入职,软件测试岗,有点迷茫不知道下一步怎么提升自己

软件测试前景和发展都是不错,已经入了软件测试这行业就坚挺下去

大白的博客 2218

wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

本文主要介绍如何在stm32mp157中移植并测试芯片RTL8723DS的wifi功能。

汉尼拔勇闯天涯 8741

【RT-DETR涨点改进】独家小目标涨点改进篇 | TGRS 2025 | RT-DETR引入ABRNet小目标检测顶刊中的:ARF自适应性感受野和MCA双向交叉轴注意力,适合小目标检测有效涨点

本文提出了一种改进的RT-DETR小目标检测方法,通过集成自适应感受野模块(ARF)和多尺度交叉轴注意力模块(BC)来提升检测性能。ARF模块采用多种卷积核动态调整感受野,有效捕获多尺度目标特征并减少背景干扰;BC模块通过多尺度交叉轴注意力机制增强全局信息提取和特征融合能力。实验表明,该方法在复杂背景下显著提升了红外小目标检测的精度和效率,同时降低了计算开销。文章详细介绍了模块结构、原理及实现代码,并提供了多种改进配置方案,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 570

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

基于未来出行解决方案的场景实例:城市空中交通(UAM)的飞行路径规划与避障

本文介绍了使用Simulink进行城市空中交通(UAM)飞行路径规划与避障的仿真方法。主要内容包括:1)UAM系统架构与核心挑战;2)详细建模步骤,从城市3D环境构建到飞行器动力学模拟;3)全局路径规划(A*/RRT*)和局部避障(DWA/APF)算法实现;4)多机协同与冲突解决;5)关键场景仿真与性能评估;6)高级功能拓展方向。通过Simulink的数字孪生系统,可有效验证UAM在复杂城市环境中的可行性,为未来立体交通发展提供技术支撑。

xiaoheshang_123的博客 257

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 数据仓库指标体系搭建实战
下一篇: Spring Security 动态权限实现方案
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值