本文首发于 Ficow Shen’s Blog,原文地址: Combine 框架,从0到1 —— 4.在 Combine 中执行异步代码。
内容概览
- 前言
- 用
Future
取代回调闭包 - 用输出类型(
Output Types
)代表Future
的参数 - 用
Subject
取代重复执行的闭包 - 总结
前言
你的应用可能会使用一些常见的模式来处理异步事件,比如:
- 完成处理器(Completion handlers)。它其实是调用方提供的一个闭包,当一个耗时任务完成后,这个闭包会被调用一次;
- 闭包属性(Closure properties)。它其实也是调用方提供的一个闭包,这个闭包会在每一次异步事件发生时被调用;
Combine
为这些模式提供了强大的替换选项。它可以让你消除这种样板代码,并且充分利用 Combine
中的操作符。当你在应用的其他地方采用 Combine
时,将异步调用点转换为 Combine
可以提高代码的一致性和可读性。
用 Future
取代回调闭包
一个完成处理器其实就是一个传给某个方法的闭包参数,当这个方法完成任务时,它就会调用这个闭包。
比如下面的代码,这个函数接收一个闭包,然后在延时2秒之后执行这个闭包:
func performAsyncAction(completionHandler: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline:.now() + 2) {
completionHandler()
}
}
你可以用 Combine
中的 Future
去替换这种模式的代码。用 Future
创建一个发布者去执行一些工作,然后异步发送成功或者失败的信号。如果执行成功,Future
就会执行一个 Future.Promise
,这是一个用来接收 Future
生成的元素的闭包。
你可以像这样重写上面的代码: