在Swift中同步多个异步任务

您可能会遇到这样的情况:首先需要完成一些异步任务,然后才能跳到快速程序的下一个阶段。 在本文中,我们研究了可以应用于异步运行任务并在流程结束时获得通知或获取结果的不同解决方案。

通常,您可能需要先存储多个网络请求的结果,然后再向用户显示正确的数据。

的确,如果您必须请求许多网络资源来执行应用程序的功能,它可能会消耗更多的设备能量,您可能会三思而后行,但这与本文无关。

假设我们有一个示例网络请求函数,如下所示:

我们希望通过网络满足一些网络要求:

在上面的示例中, baseUrl指示我们的基本端点URL,并且这些endpoints是来自Web服务器的不同请求。

多个独立任务(并发队列)

我们可以有彼此独立的不同异步任务。 这意味着我们可以以任何顺序运行它们,并且一个结果与另一任务无关。

派遣组

Grand Central Dispatch或GCD自动管理线程的创建,并根据iOS中可用的设备资源来平衡线程的创建。

我们可以使用DispatchGroup创建一堆异步任务,并在所有任务完成后继续我们的工作:

当任务完成时,我们已通知主线程,但也可以是其他任何线程。 以下输出可能是结果(或子任务完成的任何任意顺序):

 任务相册已完成 
 任务发布完成 
 待办事项 
 任务注释已完成 
 任务用户完成 
 任务照片完成 
  所有任务都完成了 

如您所见,在处理完所有任务后,我们收到了“所有任务已完成”消息。

承诺

强烈建议您使用一种模式来解决此问题:承诺。

一般来说,promise表示异步任务的最终结果 ,或者表示任务失败时的错误原因 。 类似的概念也称为期货 (有关更多信息,期货和承诺,请参阅此Wiki文章)。

我们可以假设一个承诺的3个不同状态:

待处理 尚未解决的任务,结果尚不可用

已完成 :具有一定价值的已解决任务(成功响应)

拒绝 :已解决任务,但有错误

有很多Cocoapods库可以提供承诺。 Google Promises是Swift中最好的实现之一:

谷歌/承诺
Promises是一个现代框架,为Swift和Objective-C提供了同步结构。 – google / promises github.com

现在我们可以使用Promises更新解决方案:

可以看出,promise简化了异步任务过程。 在performNetworkPromise我们首先创建了一个待处理流程,该流程将返回一些数据。 就像我们已初始化的一个空的异步请求容器一样。 承诺中的数据类型决定了将要满足的数据类型。 然后我们执行了网络请求。 结果,当我们有一个响应时,我们用该响应中的数据来填充承诺。

我们在promiseSolution创建了一系列网络请求,命名为networkPromisesall class方法等待所有提供的promise(在此是网络请求)得到满足。 一旦使用适当的数据满足了所有要求,它将构成所有满足的值[Data]的数组。

在Swift社区中如此流行的另一个Promise实现是PromiseKit。

mxcl / PromiseKit
Swift和ObjC的承诺。 通过在GitHub上创建一个帐户为mxcl / PromiseKit开发做出贡献。 github.com

它们彼此非常相似(关键字几乎相同)。 您可以自己检查一下。 请记住,不要在单个范围内同时使用它们。

您可以在以下存储库中找到本文的源代码:

novinfard / SyncAsyncTasks
在Swift中同步多个异步任务。 通过创建帐户为novinfard / SyncAsyncTasks开发做出贡献…… github.com