带你读《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

相关文章
|
Swift
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)
100 0
|
缓存 API 开发工具
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(2)
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)
104 0
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(4)
110 0
|
SQL 缓存 JSON
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(1)
164 1
|
网络协议
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(2)
131 1
|
算法
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(3)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(6)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
带你读《2022技术人的百宝黑皮书》——性能优化之接口优化(5)
111 1
|
安全
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)
|
监控 iOS开发
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(3)