带你读《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的在两个方面的推广形式,首先,continuation是 first-class的,可以作为变量存储,可以作为函数的参数和返回值,其次,continuation可以多次使用,而return只能有一次。
带你读《2022技术人的百宝黑皮书》——响应式编程的复杂度和简化(5)https://developer.aliyun.com/article/1339634?groupCode=taobaotech