在Swift中链接异步函数

在本文中,我们将看到如何在Swift中使用函数组合来链接多个异步请求(不必用于RxSwift)。

编辑:Brandon Kase指出,这种组合实际上称为Kleisli组合,并且要使用的正确运算符是fish / Kleisli运算符: >=> (而不是|> )。

这很棒! 一件事:我建议使用> =>运算符代替|>,因为|>(称为管道转发)传统上用于向后函数应用程序。 您在这里拥有的是kleisli合成(并且> =>是kleisli合成运算符)。

-Brandon Kase(@bkase_) 2018年2月1日

[您可以下载本文的配套 Playground 。]

假设我们有一个具有以下模型的付款验证应用程序:

对Web服务的一般请求可能如下所示:

正如您应该猜到的那样,我们将使用函数组合来实现这一点。

让我们采用通用请求函数:

  func fetch(_输入:InputType,完成:(Result )->无效) 

并用以下别名表示它:

 公共类型别名Request  =(T,@转义RequestCompletion )->无效 

在我们的例子中,U将映射到 Result

接下来,我们将定义一个运算符,该运算符将允许我们通过管道传递请求。

分解> =>运算符

该运算符是TUV三种类型的泛型运算符,并使用2个函数fg作为参数,其中:

  • f取一个T并以Result
  • g取一个U并以Result

它返回一个带有签名的组合函数: Request<T, Result>即接受f输入并以Result完成的函数。

注意:

  • 输入为 T 类型
  • CombineCompletion的类型为RequestCompletion RequestCompletion<Result>

这个返回函数的实现从应用f开始,然后在f的完成块中,它切换一个Result

  • 如果f.success ,它将使用成功值并调用gg完成时(带有Result ),它将对该result执行combineCompletion
  • 如果f.failure完成, .failure它不会再继续移动,并调用带有相应错误的combineCompletion

完成此操作后,我们上面的复杂验证代码将变为:

我们首先用3个请求组成一个validation函数。 然后,要执行实际的验证,我们只需传入客户标识符,然后在其完成块中打开result以查看是否能够成功获取客户的所有必需属性。

这里的所有都是它的!

将您的意见留在评论部分。