1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        o1?/???? WWDC | 圖解 AsyncSequence 異步序列

        共 2706字,需瀏覽 6分鐘

         ·

        2021-06-27 05:42



        Swift 5.5 為我們帶來(lái)了 async/await,同時(shí)也為我們帶來(lái)了與之相關(guān)的一些新的設(shè)計(jì)模式和便捷的 API,能讓我們更舒服地寫(xiě)代碼?;?async/await 的異步序列就是其中之一。《Meet AsyncSequence》這個(gè) Session 就向我們介紹了異步序列的概念以及使用,一起來(lái)看看。


        認(rèn)識(shí)異步序列


        上面這段代碼的目標(biāo)是下載一個(gè) csv 文件。一個(gè) csv 文件是一個(gè)文本文件,每行是一個(gè)完整數(shù)據(jù)行,每行通過(guò)指定的分割符組織數(shù)據(jù)。

        下載文件通常是一件耗時(shí)的事情,如果數(shù)據(jù)量很大時(shí),可能需要等待很長(zhǎng)時(shí)間,因此我們通常會(huì)讓它異步執(zhí)行。但有時(shí)候我們可能并不想等待所有東西都下載完再展示,而是邊下載邊展示。所以上面的代碼使用了 async/await,即 for-await-in 配合 URL.lines.dropFirst() 函數(shù),在接收到每一行時(shí),去執(zhí)行想要的操作。

        在 《Meet Swift async/await》中可以了解 async/await,在這不多做解釋。

        這里我們的關(guān)注點(diǎn)是 URL.lines 這個(gè)屬性,文檔目前沒(méi)有對(duì) lines 的詳細(xì)解釋?zhuān)覀兛梢钥聪滤穆暶鳎?/p>

        var lines: AsyncLineSequence<URL.AsyncBytes> { get }

        lines 的類(lèi)型是 AsyncLineSequence,是文本行的異步序列

        struct AsyncLineSequence<Base> where Base : AsyncSequence, Base.Element == UInt8

        而它繼承自 AsyncSequence,也就是我們今天的主角。它是一個(gè)協(xié)議,提供對(duì)其元素的異步、順序、迭代訪(fǎng)問(wèn)。

        // A type that provides asynchronous, sequential, iterated access to its elements.
        protocol AsyncSequence

        AsyncSequence 會(huì)在每個(gè)元素上掛起,并在底層迭代器產(chǎn)生值或拋出異常時(shí)恢復(fù)。

        異步序列更像是描述如何隨時(shí)間產(chǎn)生值,可能產(chǎn)生 0 個(gè)或多個(gè)值,當(dāng)?shù)鞣祷?nil 時(shí),表示迭代完成,與普通序列一樣。而錯(cuò)誤發(fā)生時(shí),也會(huì)返回 nil 表示結(jié)束。


        基本原理



        如上兩圖,對(duì)于常規(guī)迭代,編譯器會(huì)做一些簡(jiǎn)單的轉(zhuǎn)換。首先創(chuàng)建一個(gè)迭代器變量,然后在 while 循環(huán)中調(diào)用 next()

        而要使用 async/await,編譯只做了一個(gè)很小的改動(dòng),將 makeIterator() 改成 makeAsyncIterator() 即可,這時(shí)便可以使用 for-await-in 了。實(shí)際上,AsyncSequence 的使用與 Sequence 很相似。





        使用

        有幾種方法可以使用異步序列

        ? for-await-in
        ? for-try-await-in:異步序列會(huì)招拋出異常;

        另外,異步序列中同樣可以使用 break 來(lái)跳出循環(huán),或者使用 continue 來(lái)跳過(guò)本次循環(huán)

        由于異步序列可能拋出異常,所以我們同樣可以捕獲異常來(lái)處理


        還可以使用 async 來(lái)封裝異步序列迭代,讓異步序列迭代與其它任務(wù)并行。如果異步序列是無(wú)限運(yùn)行的,這怎么處理就很有用。


        更重要的是,我們還可以顯示終止迭代



        新的 AsyncSequence API

        除了新加了 AsyncSequence 及相關(guān)類(lèi)外,Swift 5.5 也內(nèi)置了很多現(xiàn)成的 AsyncSequence API。我們一起來(lái)看看。

        ? FileHandle:從文件中讀取通常是異步行為的主要用例,F(xiàn)ileHandle 現(xiàn)在有一個(gè)新的 bytes 屬性,可以訪(fǎng)問(wèn)來(lái)自該 FileHandle 的異步字節(jié)序列

        ? URL:URL 新增了一個(gè)便利屬性,可以從文件或網(wǎng)絡(luò)中的內(nèi)容返回 AsyncSequence 行,這將使許多以前非常復(fù)雜的任務(wù)變得簡(jiǎn)單和安全。

        ? URLSession:URLSession 現(xiàn)在有一個(gè) bytes 函數(shù)來(lái)獲取給定 URL 或 URLRequest 的異步字節(jié)序列。

        ? Notification:通知現(xiàn)在也可以使用新的通知 API 來(lái)等待通知,可以看到迭代并不是與 AsyncSequence 交互的唯一方式。使用像 firstWhere 這樣的方法,連同通知異步序列,允許一些非常簡(jiǎn)潔的新設(shè)計(jì)模式,可以使以前表達(dá)復(fù)雜邏輯的代碼現(xiàn)在緊湊且更易于閱讀。

        當(dāng)然,還有許多其它新的 API 用于異步操作,以用于處理異步序列的值。


        構(gòu)建自己的異步序列

        除了使用 SDK 提供的內(nèi)置 API 外,我們也可以自定義異步序列。使用異步序列的場(chǎng)景也很廣,幾乎任何不需要響應(yīng)并且只是通知出現(xiàn)新值的場(chǎng)景都適合異步序列。

        例如下面這個(gè)場(chǎng)景,QuakeMonitor 有一個(gè)處理程序?qū)傩院蛦?dòng)/停止監(jiān)聽(tīng)方法,很適合使用異步序列。

        創(chuàng)建了一個(gè)監(jiān)視器,并分配了一個(gè)獲取值的處理程序,然后啟動(dòng)監(jiān)視器,以便可以將地震發(fā)送到處理程序。只需少量代碼即可構(gòu)建異步序列。

        構(gòu)造異步流時(shí),指定元素類(lèi)型和構(gòu)造閉包。閉包中有一個(gè) yield,可以多次產(chǎn)生值、完成或處理終止。onTermination 可以處理取消和清理。


        使用起來(lái)也很方便,如結(jié)合現(xiàn)有的 filter 方法,或者使用 for-await-in 語(yǔ)句。


        上面創(chuàng)建異步序列是基于 AsyncStream,它包括異步序列所有需要所有事情,如安全性、迭代、取消操作、甚至是處理緩沖。


        而如果涉及到錯(cuò)誤處理的話(huà),則需要使用到 AsyncThrowingStream,它與 AsyncStream 一樣,但可以通過(guò)從迭代中拋出異常來(lái)處理失敗。



        小結(jié)

        AsyncSequence 是一個(gè)非常強(qiáng)大的工具,可以安全地處理多個(gè)異步值。而且使用起來(lái)和 Sequence 一樣簡(jiǎn)單,為我們的代碼帶來(lái)更多便捷。



        推薦閱讀

        ?  oo?/???? WWDC | 初識(shí) Xcode Cloud
        ?  oo?/???? WWDC | 性能優(yōu)化終極生存指南
        ?  o1o/???? WWDC | 8 分鐘優(yōu)化你的 App Store 產(chǎn)品頁(yè)
        ?  o11/???? WWDC | App Clips 新特性


        分享,收藏,點(diǎn)贊,在看四連,就差您了 ??????

        瀏覽 38
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产人妖网站 | 无尽夜久久久久久久久久 | 一级艳片加勒比女海盗1 | .asian美白裸体女pics | 少萝被黄漫扒衣服 | 91麻豆精品 | 美女黄www | 成人福利导航在线 | 欧美性护士vidos护士 | 三级中文 |