Swift并发系统并行运行多个任务使用详解.docx

Swift并发系统并行运行多个任务使用详解.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Swift并发系统并行运行多个任务使用详解

目录前言从异步到并发任务组结论

前言

Swift内置并发系统的好处之一是它可以更轻松地并行执行多个异步任务,这反过来又可以使我们显着加快可以分解为单独部分的操作。

在本文中,让我们看一下几种不同的方法,以及这些技术中的每一种何时特别有用。

从异步到并发

首先,假设我们正在开发某种形式的购物应用程序来显示各种产品,并且我们已经实现了一个ProductLoader允许我们使用一系列异步API加载不同产品集合的应用程序,如下所示:

classProductLoader{

funcloadFeatured()asyncthrows-[Product]{

funcloadFavorites()asyncthrows-[Product]{

funcloadLatest()asyncthrows-[Product]{

}

尽管大多数情况下上述每个方法都可能会被单独调用,但假设在我们应用程序的某些部分中,我们还希望形成一个Recommendations包含这三个ProductLoader方法的所有结果的组合模型:

extensionProduct{

structRecommendations{

varfeatured:[Product]

varfavorites:[Product]

varlatest:[Product]

一种方法是使用await关键字调用每个加载方法,然后使用这些调用的结果来创建我们Recommendations模型的实例如下所示:

extensionProductLoader{

funcloadRecommendations()asyncthrows-Product.Recommendations{

letfeatured=tryawaitloadFeatured()

letfavorites=tryawaitloadFavorites()

letlatest=tryawaitloadLatest()

returnProduct.Recommendations(

featured:featured,

favorites:favorites,

latest:latest

}

上面的实现确实有效然而,即使我们的三个加载操作都是完全异步的,它们目前正在按顺序执行,一个接一个。因此,尽管我们的顶级loadRecommendations方法相对于我们应用程序的其他代码正在并发执行,但实际上它还没有利用并发来执行其内部操作集。

由于我们的产品加载方法不以任何方式相互依赖,因此实际上没有理由按顺序执行它们,所以让我们看看如何让它们完全同时执行。

关于如何做到这一点的初步想法可能是将上述代码简化为单个表达式,这将使我们能够使用单个await关键字来等待我们的每个操作完成:

extensionProductLoader{

funcloadRecommendations()asyncthrows-Product.Recommendations{

tryawaitProduct.Recommendations(

featured:loadFeatured(),

favorites:loadFavorites(),

latest:loadLatest()

}

然而,即使我们的代码现在看起来是并发的,它实际上仍会像以前一样完全按顺序执行。

相反,我们需要利用Swift的asynclet绑定来告诉并发系统并行执行我们的每个加载操作。使用该语法使我们能够在后台启动异步操作,而无需我们立即等待它完成。

await如果我们在实际使用加载的数据时(即形成模型时)将其与单个关键字组合Recommendations,那么我们将获得并行执行加载操作的所有好处,而无需担心状态管理或数据竞争之类的事情:

extensionProductLoader{

funcloadRecommendations()asyncthrows-Product.Recommendations{

asyncletfeatured=loadFeatured()

asyncletfavorites=loadFavorites()

asyncletlatest=loadLatest()

returntryawaitProduc

文档评论(0)

159****6192 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档