带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(4)

简介: 带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(4)

带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)https://developer.aliyun.com/article/1339637?groupCode=taobaotech

第三步,这样就可以将load方法简化为:

 

1func rxLoad() -> Observable<[OrderObject]> {
2let orderService = [OrderService("鹅鹅鹅"), OrderService("鸭鸭鸭")] 
// 通过map构造Observable,通过flatMap对listOrder和queryUserInfo进行复合let observables = orderService.map { orderService in
makeObservable(f: orderService.listOrders).flatMap { (orders) -> Observable<[OrderObject]> in let userLoadF = makeStreamFunc(orders: orders, userInfoService: getUserService(site: order-
Service.site))
return makeObservable(f: userLoadF)

 

 

9

 

}

10

 

}

11

 

 

12

 

// merge两个平台的Observable

13

 

return Observable.merge(observables)

14

}

 

 

 

 

可以看到,第一步是通用的,实际代码中只需要做第二步和第三步,这就对上面的接口进行了大量的简化,并且库以统一的方式处理掉了合并、级联、多数据返回的复杂逻辑,我们有相当的把握来保证正确性。当然,除了学习成本较高以外,也还是有缺点的,主要是使用方式仍然是异步形式,在部分环节仍然需要处理异步带来的复杂度:

// 使用方调用
rxLoad().subscribe { orderObjects in
// onNext闭包中处理数据
} onError: { error in
// onError闭包中处理错误
} onCompleted: {
// onCompleted闭包中处理完成
} onDisposed: {
}

Rx确实大大简化了异步编程,但是还不够,因为它的使用仍然是异步形式。

 

使用AsyncSequence简化响应式编程

迭代器与序列

 

迭代器是很多语言都有的一个概念,一个迭代器的核心是next()函数,每次调用都会返回下一个数据,这些数据构   成了一个序列(Sequence),迭代器也意味着序列可以被遍历。

 

异步序列

 

代器的next()方法支持异步,就产生了异步序列。Swift对此提供了一个AsyncSequence的协议,并对它 提供了语言级别的支持,使得开发者可以以同步的形式遍历一个异步序列:

1for try await data in asyncDataList {
2print("async get data : + \(data)") 3  }


实际上,Swift在Combine中支持了Publisher的同步遍历:

// Combine的同步调用
for try await data in publisher.values {
print("async get publiser value \(data)") 4 }

 

 

 

不过这个特性需要iOS15才能支持,如果说iOS13还可以展望的话,iOS15就是遥遥无期了。

 

CPS变换

 

如果能将流式接口转换为异步序列,那么就可以实现响应式代码的同步编写,这个转换过程可以通过CPS变换实现。

 

CPS变换全称Continuation-Pass-Style,这个概念来自Lisp语系,是一种显式传递控制流的编程风格,其传递  控制流的载体就是continuation。continuation可以理解为当前代码执行的后续,如果一个函数f有一个continua- tion参数,我们就可以把当前的continuation传递进去,当函数产生结果时,通过continuation回到函数f外,继续  执行,这种函数调用方式成为call/cc(call with current continuation)。

 

这种变换,称为CPS变换。

 

作为一个类比,我觉得可以将continuation理解为return的在两个方面的推广形式,首先,continuationfirst-class的,可以作为变量存储,可以作为函数的参数和返回值,其次,continuation可以多次使用,而return只能有一次。

 

带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)https://developer.aliyun.com/article/1339634?groupCode=taobaotech

相关文章
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
614 216
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
853 61
|
7天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1276 157
|
5天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
241 138
|
7天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
528 109