承诺:一种使异步网络代码“ NSYNC”的方法
有了一个承诺,我就不需要在完成闭包中处理字典的解析,我可以将该动作链接到“获取JSON数据”动作。 见下文:
在上面的代码要点中,在第1行上,您可以看到我的getArticles()方法返回了Promise
为了实现这些承诺,我使用了一个名为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入门