承诺:一种使异步网络代码“ NSYNC”的方法

有了一个承诺,我就不需要在完成闭包中处理字典的解析,我可以将该动作链接到“获取JSON数据”动作。 见下文:

在上面的代码要点中,在第1行上,您可以看到我的getArticles()方法返回了Promise

。 此功能“有前途”的意思是,在我收到文章后,我将返回文章的承诺。 我将通过返回文章(也就是我在第13行的结果 )来实现这一承诺。

为了实现这些承诺,我使用了一个名为PromiseKit的第三方库。 我将向您介绍如何将PromiseKit集成到我的应用程序中。

首先 -为您的项目创建/打开一个Podfile。 在Terminal中,我使用Sublime(因此称为subl Podfile)打开了Podfile。 确保您位于项目文件的当前目录(文件夹)中。

第二个 -在您的Podfile中,在下面添加第10行。 保存并关闭此Podfile。

第三 —在终端中,键入“ pod install”。此说明将PromiseKit库安装到您的项目中。

第四 -在终端中,打开.xcworkspace (而不是.xcodeproj)!

第五步–在要编写网络代码的文件中,在顶部导入PromiseKit。 按⌘+ B,这会将PromiseKit库构建到您的项目中。

第六 -开始编写代码!

在这个应用程序示例中,我有一个Article模型(上文),它将从NYTimes API获取数据以创建Article对象。

我已经在上面的屏幕截图中注释了我的代码,但是我将在这里再次概述它:

A —我没有使用完成闭包,而是让我的网络函数返回了类型为Promise的Promise。

B — Promise块需要实现和拒绝方法。

C-这个URL是我用来获取任何Cuba文章的NYTimes API数据的URL。 古巴是我去过的最有趣的国家。 (旁问:您访问过的最有趣的国家/地区是什么?)

D-解开网址后,创建一个URLRequest

E-创建一个URLSession

F —创建一个URLDataPromise(PromiseKit随附)。 它返回一个专门的Promise包装URLSession.dataTask(with :)。 重要的是要注意,这是我们要做的第一个动作,第一个承诺。 我们正在写一个从dataPromise获取数据的承诺。

G —在我的dataPromise上,我做第二个PROMISE。 我们承诺将数据(从我们的第一个承诺开始)转换为反序列化字典。 您会注意到.then语法。 读起来很不错,就像您说的那样:“如果出现此内容,那么我会做些处理。”

H-现在第二个承诺已经实现(我有一个字典),我可以使用该字典创建我的Article对象之一。 让我们获得古巴的文章! 如果我能够成功地创建文章,那就太好了,我已经兑现了我的诺言。 我可以将这篇文章(也称为result )传递给complement()方法。

I-如果无法创建文章,则可以创建一个指示该错误的错误,并相应地将该错误传递给reject()方法。

J —最后,使用JSONSerialization,我需要执行/尝试/捕获,因为它会抛出异常。 对于Promise,我有一个.catch块,该块传递了reject()方法的错误。

我计划下次在项目中嵌套异步代码时使用Promise。 您将如何使用诺言?

资源:

承诺模式

Ray Wenderlich — PromiseKit入门