<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2706字,需瀏覽 6分鐘

           ·

          2021-06-27 05:42



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


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


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

          下載文件通常是一件耗時(shí)的事情,如果數(shù)據(jù)量很大時(shí),可能需要等待很長時(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è)屬性,文檔目前沒有對(duì) lines 的詳細(xì)解釋,我們可以看下它的聲明:

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

          lines 的類型是 AsyncLineSequence,是文本行的異步序列

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

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

          // 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ì)做一些簡單的轉(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 來跳出循環(huán),或者使用 continue 來跳過本次循環(huán)

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


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


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



          新的 AsyncSequence API

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

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

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

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

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

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


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

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

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

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

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


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


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


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



          小結(jié)

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



          推薦閱讀

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


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

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本一道码高清无码 | 久久骚逼视频 | 美少妇av | 图片区视频区小说区 | 大鸡巴操逼视频网站 |