以相同的功能组合委托和块

在我正在从事的项目中,我们将代码分配拆分为多个小模块(框架),其中一个用于请求唯一标识符(在服务器端生成),该标识符将在每个API请求中使用,但在某些情况下,用户必须输入密码才能生成该唯一代码,因此该模块需要在用户界面中填充一些内容,但是如何获取呢?

因为我无法向您显示我们的代码,所以我创建了一个项目以将信用卡保存在本地钥匙串中,如果找不到卡,我们将要求用户按照以下UML序列图的说明将卡的详细信息提供给我们:

NS通知

我讨厌通知,它们很难调试,并且增加了代码的复杂性。

如果我们想使用它们来解决问题,我们将至少需要3条通知,这太丑陋了!

代表

委托可以是一个解决方案,但是问题在于“进行结帐”是基于区块(异步http请求)的,因此,如果我们在钥匙串中未找到信用卡,我们将取消该请求。

委托+块(或Swift中的闭包)

这是我自带的解决方案,而不仅仅是使用委托,而是在委托函数中添加了一个完成块:

  func creditCardNeeded(错误:NSError,完成:@转义(_ creditCard:Dictionary )->无效); 
  • 此功能的第一部分是告知代表我们需要信用卡。
  • 第二部分(关闭部分)将用于将信用卡详细信息从用户界面发送回框架。

是时候查看完整的代码🙂

  1. 根视图控制器ViewController

在这里,我们开始结帐过程(payAction是起点)。

请注意,我们保留了要使用的闭包的引用( self.cardCompletion = complete )。

2. CardDetaildViewController

该视图控制器将用于让用户填写卡的详细信息。

3. PaymentManager:框架类

在这里,我们使用委托功能开始请求或要求提供卡详细信息。

这里的主要问题是,当用户验证其卡详细信息时,我们将使用闭包引用返回框架并继续执行任务!

您可以在github上找到完整的代码:https://github.com/Red-Mak/RMDelegateWithCompletion