当前位置:首页 > 时尚 >

combine 怎么用(combine能转换成什么)

来源:原点资讯(www.yd166.com)时间:2023-10-31 13:58:51作者:YD166手机阅读>>

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

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

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

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

响应式编程

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

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

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

声明式编程

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

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

  1. 遍历数组中的所有元素。
  2. 判断是否为奇数。
  3. 如果是的话,加入到结果中。继续遍历。

var results = [Int]() for num in values { if num %2 != 0 { results.append(num) } }

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

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

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

  • 指令式编程:描述过程(How),计算机直接执行并得结果。
  • 声明式编程:描述结果(What),让计算机为我们组织出具体过程,最后得到被描述的结果。
“面向数据流和变化传播”

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

combine 怎么用,combine能转换成什么(1)

  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% 多的性能提升。

combine 怎么用,combine能转换成什么(2)

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能转换成什么(3)

Combine 接口

上文提到,Combine 的接口是基于 Reactive Streams Spec 实现的,Reactive Streams 中已经定义好了 Publisher, Subscriber,Subscription 等概念,Apple 在其上有一些微调。

具体到接口层面,Combine API 与 RxSwift API 比较类似,更精简,熟悉 RxSwift 的开发者能无缝快速上手 Combine。Combine 中缺漏的接口可以通过其他已有接口组成替代,少部分操作符也有开源的第三方实现,对生产环境的使用不会产生影响。

combine 怎么用,combine能转换成什么(4)

首页 123下一页

栏目热文

combine服装(combine高腰套装)

combine服装(combine高腰套装)

作为服装企业管理者,您是否有一些困惑:面辅料没有来,流水线又断了?未按时出货,客户要罚款?整天忙碌,管理工作收效甚微?您...

2023-10-31 14:03:44查看全文 >>

combine用法和搭配(combine with用法例子)

combine用法和搭配(combine with用法例子)

combine [kəmˈbaɪn , ˈkɑːmbaɪn] v.(使)结合,组合,联合,混合;兼有;兼备;使融合(或并...

2023-10-31 13:29:00查看全文 >>

王者荣耀相机高度标准(王者荣耀相机高度怎么只有标准了)

王者荣耀相机高度标准(王者荣耀相机高度怎么只有标准了)

拍摄人像时选择合适的拍摄,角度可以突出模特的特点和个性,以下是14种常用的拍摄角度供您参考:·1.正面拍摄:即相机与模特...

2023-10-31 14:04:55查看全文 >>

王者荣耀相机调成近景好还是标准(王者荣耀相机只有标准近景)

王者荣耀相机调成近景好还是标准(王者荣耀相机只有标准近景)

如今市场旗舰机的定义是什么呢?除了基本的处理器配置,就是看这款手机的拍照性能了。(我也不知道为啥所有厂家都宣传拍照能力)...

2023-10-31 13:35:54查看全文 >>

王者荣耀相机高度低好还是高好(王者荣耀设置相机高度高还是低)

王者荣耀相机高度低好还是高好(王者荣耀设置相机高度高还是低)

山河不足重,重在遇知已。好久不见,别来无恙。来自小助理的文章推送~王者荣耀这个赛季已经过去了将近两个半月了,按道理来说再...

2023-10-31 13:34:16查看全文 >>

compete的几种搭配(compete怎样记)

compete的几种搭配(compete怎样记)

英语(奥赛题库)1.By the time your plane lands tonight, I()at the ai...

2023-10-31 13:51:53查看全文 >>

developed的搭配(define与什么搭配)

developed的搭配(define与什么搭配)

内容简介今天学习下多义词 “develop” 的用法。动词 “develop” 既可以作及物动词,也可以作不及物动...

2023-10-31 13:37:04查看全文 >>

correlate的搭配(collaborate用法搭配)

correlate的搭配(collaborate用法搭配)

今天是第98天。明天你好我不会再跌倒。Day981.socce['sɒkə]n.英式足球,足球【短语搭配】①soccer...

2023-10-31 13:51:29查看全文 >>

combine怎么记忆(combine是主动还是被动)

combine怎么记忆(combine是主动还是被动)

combine/kəmˈbaɪn/v. (使)融合;(使)结合,(使)混合;兼做;合并一、单词记忆要记忆这个单词我们先复...

2023-10-31 13:52:53查看全文 >>

乐高蝙蝠侠大电影终极档案故事(乐高蝙蝠侠大电影人物图鉴)

乐高蝙蝠侠大电影终极档案故事(乐高蝙蝠侠大电影人物图鉴)

相声演员岳云鹏,曾在微博上吐槽:我闺女每天都会有各种各样的“为什么”,我承认我们两口子招架不住了…… ...

2023-10-31 13:54:54查看全文 >>

文档排行