最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift并發(fā)系統(tǒng)并行運(yùn)行多個任務(wù)使用詳解

 更新時間:2023年06月15日 15:31:57   作者:Swift社區(qū)  
這篇文章主要為大家介紹了Swift并發(fā)系統(tǒng)并行運(yùn)行多個任務(wù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

Swift 內(nèi)置并發(fā)系統(tǒng)的好處之一是它可以更輕松地并行執(zhí)行多個異步任務(wù),這反過來又可以使我們顯著加快可以分解為單獨部分的操作。

在本文中,讓我們看一下幾種不同的方法,以及這些技術(shù)中的每一種何時特別有用。

從異步到并發(fā)

首先,假設(shè)我們正在開發(fā)某種形式的購物應(yīng)用程序來顯示各種產(chǎn)品,并且我們已經(jīng)實現(xiàn)了一個ProductLoader允許我們使用一系列異步 API 加載不同產(chǎn)品集合的應(yīng)用程序,如下所示:

class ProductLoader {
    ...
    func loadFeatured() async throws -> [Product] {
        ...
    }
    func loadFavorites() async throws -> [Product] {
        ...
    }
    func loadLatest() async throws -> [Product] {
        ...
    }
}

盡管大多數(shù)情況下上述每個方法都可能會被單獨調(diào)用,但假設(shè)在我們應(yīng)用程序的某些部分中,我們還希望形成一個Recommendations包含這三個ProductLoader方法的所有結(jié)果的組合模型:

extension Product {
    struct Recommendations {
        var featured: [Product]
        var favorites: [Product]
        var latest: [Product]
    }
}

一種方法是使用await關(guān)鍵字調(diào)用每個加載方法,然后使用這些調(diào)用的結(jié)果來創(chuàng)建我們Recommendations模型的實例——如下所示:

extension ProductLoader {
    func loadRecommendations() async throws -> Product.Recommendations {
        let featured = try await loadFeatured()
let favorites = try await loadFavorites()
let latest = try await loadLatest()
        return Product.Recommendations(
            featured: featured,
            favorites: favorites,
            latest: latest
        )
    }
}

上面的實現(xiàn)確實有效——然而,即使我們的三個加載操作都是完全異步的,它們目前正在按順序執(zhí)行,一個接一個。因此,盡管我們的頂級loadRecommendations方法相對于我們應(yīng)用程序的其他代碼正在并發(fā)執(zhí)行,但實際上它還沒有利用并發(fā)來執(zhí)行其內(nèi)部操作集。

由于我們的產(chǎn)品加載方法不以任何方式相互依賴,因此實際上沒有理由按順序執(zhí)行它們,所以讓我們看看如何讓它們完全同時執(zhí)行。

關(guān)于如何做到這一點的初步想法可能是將上述代碼簡化為單個表達(dá)式,這將使我們能夠使用單個await關(guān)鍵字來等待我們的每個操作完成:

extension ProductLoader {
    func loadRecommendations() async throws -> Product.Recommendations {
        try await Product.Recommendations(
            featured: loadFeatured(),
            favorites: loadFavorites(),
            latest: loadLatest()
        )
    }
}

然而,即使我們的代碼現(xiàn)在看起來是并發(fā)的,它實際上仍會像以前一樣完全按順序執(zhí)行。

相反,我們需要利用 Swift 的async let綁定來告訴并發(fā)系統(tǒng)并行執(zhí)行我們的每個加載操作。使用該語法使我們能夠在后臺啟動異步操作,而無需我們立即等待它完成。

await如果我們在實際使用加載的數(shù)據(jù)時(即形成模型時)將其與單個關(guān)鍵字組合Recommendations,那么我們將獲得并行執(zhí)行加載操作的所有好處,而無需擔(dān)心狀態(tài)管理或數(shù)據(jù)競爭之類的事情:

extension ProductLoader {
    func loadRecommendations() async throws -> Product.Recommendations {
        async let featured = loadFeatured()
async let favorites = loadFavorites()
async let latest = loadLatest()
        return try await Product.Recommendations(
            featured: featured,
            favorites: favorites,
            latest: latest
        )
    }
}

很整齊!因此async let,當(dāng)我們有一組已知的、有限的任務(wù)要執(zhí)行時,它提供了一種同時運(yùn)行多個操作的內(nèi)置方法。但如果不是這樣呢?

任務(wù)組

現(xiàn)在假設(shè)我們正在開發(fā)一個ImageLoader可以讓我們通過網(wǎng)絡(luò)加載圖像的工具。要從給定的 加載單個圖像URL,我們可以使用如下所示的方法:

class ImageLoader {
    ...
    func loadImage(from url: URL) async throws -> UIImage {
        ...
    }
}

為了使一次加載一系列圖像變得簡單,我們還創(chuàng)建了一個方便的 API,它接受一個 URL 數(shù)組并異步返回一個圖像字典,該字典由下載圖像的 URL 鍵控:

extension ImageLoader {
    func loadImages(from urls: [URL]) async throws -> [URL: UIImage] {
        var images = [URL: UIImage]()
        for url in urls {
            images[url] = try await loadImage(from: url)
        }
        return images
    }
}

現(xiàn)在讓我們說,就像我們ProductLoader之前的工作一樣,我們想讓上面的loadImages方法并發(fā)執(zhí)行,而不是按順序下載每個圖像(目前是這種情況,因為我們await在調(diào)用時直接使用loadImage我們的for環(huán)形)。

但是,這次我們將無法使用async let,因為我們需要執(zhí)行的任務(wù)數(shù)量在編譯時是未知的。值得慶幸的是,Swift 并發(fā)工具箱中還有一個工具可以讓我們并行執(zhí)行動態(tài)數(shù)量的任務(wù)——任務(wù)組。

要形成一個任務(wù)組,我們可以調(diào)用withTaskGroupwithThrowingTaskGroup,這取決于我們是否希望可以選擇在我們的任務(wù)中拋出錯誤。在這種情況下,我們將選擇后者,因為我們的底層loadImage方法是用throws關(guān)鍵字標(biāo)記的。

然后我們將遍歷每個 URL,就像以前一樣,只是這次我們將每個圖像加載任務(wù)添加到我們的組中,而不是直接等待它完成。相反,我們將await在添加每個任務(wù)之后單獨分組結(jié)果,這將允許我們的圖像加載操作完全并發(fā)執(zhí)行:

extension ImageLoader {
    func loadImages(from urls: [URL]) async throws -> [URL: UIImage] {
        try await withThrowingTaskGroup(of: (URL, UIImage).self) { group in
            for url in urls {
                group.addTask{
    let image = try await self.loadImage(from: url)
    return (url, image)
} 
            }
            var images = [URL: UIImage]()
            for try await (url, image) in group {
    images[url] = image
}
            return images
        }
    }
}

要了解有關(guān)上述for try await語法和一般異步序列的更多信息,請查看“異步序列、流和組合”。

就像使用 時一樣async let,以我們的操作不會直接改變?nèi)魏螤顟B(tài)的方式編寫并發(fā)代碼的一個巨大好處是,這樣做可以讓我們完全避免任何類型的數(shù)據(jù)競爭問題,同時也不需要我們引入任何鎖定或序列化代碼混合在一起。

await因此,在可能的情況下,讓我們的每個并發(fā)操作返回一個完全獨立的結(jié)果,然后依次返回這些結(jié)果以形成我們的最終數(shù)據(jù)集,這通常是一種很好的方法。

在以后的文章中,我們將更仔細(xì)地研究避免數(shù)據(jù)競爭的其他方法(例如通過使用 Swift 的新actor類型)。

結(jié)論

重要的是要記住,僅僅因為給定的函數(shù)被標(biāo)記為async并不一定意味著它同時執(zhí)行它的工作。相反,如果這是我們想要做的,我們必須故意讓我們的任務(wù)并行運(yùn)行,這只有在執(zhí)行一組可以獨立運(yùn)行的操作時才有意義。

以上就是Swift并發(fā)系統(tǒng)并行運(yùn)行多個任務(wù)使用詳解的詳細(xì)內(nèi)容,更多關(guān)于Swift并發(fā)運(yùn)行多個任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用Swift如何判斷iPhone X機(jī)型詳解

    利用Swift如何判斷iPhone X機(jī)型詳解

    近日,iPhone X的發(fā)布在人們?nèi)罕娨鹆撕艽蟮霓Z動,下面這篇文章主要給大家介紹了關(guān)于利用Swift如何判斷iPhone X機(jī)型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • R.swift的使用與安裝教程

    R.swift的使用與安裝教程

    這篇文章主要給大家介紹了關(guān)于R.swift使用與安裝的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • iOS開發(fā)中Swift 指紋驗證功能模塊實例代碼

    iOS開發(fā)中Swift 指紋驗證功能模塊實例代碼

    本文給大家分享ios調(diào)用touchid代碼塊,非常不錯,具有參考借鑒價值,需要的朋友參考下把
    2017-03-03
  • swift依賴注入和依賴注入容器詳解

    swift依賴注入和依賴注入容器詳解

    這篇文章主要為大家介紹了swift依賴注入和依賴注入容器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • swift中的@UIApplicationMain示例詳解

    swift中的@UIApplicationMain示例詳解

    這篇文章主要給大家介紹了關(guān)于swift中@UIApplicationMain的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Swift中定義單例的方法實例

    Swift中定義單例的方法實例

    Swift中單例的寫法有很多種,下面這篇文章主要給大家介紹了關(guān)于Swift中定義單例的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • Swift如何為設(shè)置中心添加常用功能

    Swift如何為設(shè)置中心添加常用功能

    這篇文章主要給大家介紹了關(guān)于Swift如何為設(shè)置中心添加常用功能的相關(guān)資料,包含了跳轉(zhuǎn)到AppStore、郵件反饋功能、系統(tǒng)分享功能以及打開某些網(wǎng)址等功能,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • Swift 常量與變量實例詳解

    Swift 常量與變量實例詳解

    這篇文章主要介紹了Swift 常量與變量實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Swift中實現(xiàn)點擊、雙擊、捏、旋轉(zhuǎn)、拖動、劃動、長按手勢的類和方法介紹

    Swift中實現(xiàn)點擊、雙擊、捏、旋轉(zhuǎn)、拖動、劃動、長按手勢的類和方法介紹

    這篇文章主要介紹了Swift中實現(xiàn)點擊、雙擊、捏、旋轉(zhuǎn)、拖動、劃動、長按手勢的類和方法介紹,本文分別給出了各種手勢的實現(xiàn)代碼,需要的朋友可以參考下
    2015-01-01
  • Swift函數(shù)提前返回實例詳解

    Swift函數(shù)提前返回實例詳解

    函數(shù)相當(dāng)重要的,下面這篇文章主要給大家介紹了關(guān)于Swift函數(shù)提前返回的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評論

合作市| 汕头市| 抚远县| 方山县| 淮滨县| 富蕴县| 梁平县| 灯塔市| 临安市| 广饶县| 湾仔区| 永年县| 乐陵市| 荥阳市| 贺州市| 西峡县| 周宁县| 德安县| 河津市| 福州市| 淳安县| 哈密市| 清徐县| 柏乡县| 略阳县| 定陶县| 四平市| 华蓥市| 常宁市| 台东县| 南华县| 民乐县| 仙桃市| 天柱县| 辽宁省| 屏山县| 资溪县| 衡阳市| 汝州市| 道孚县| 健康|