WWDC21-認識Swift中的async/await 一、實例對比 二、async/await分析 三、async/await應用相關

一、實例對比

        假如我們需要從網絡下載一個圖片,並且把圖片轉換爲縮略圖;這兩個操作都是耗時的操作,所以在下面的代碼中使用了異步下載數據與異步創建縮略圖的能力。


        如果你已經習慣於寫這樣的代碼,或者從來麼有想過這樣的代碼是否有問題。那麼,你會認爲這些代碼沒什麼問題,就應該這樣的,其實這段代碼的可讀性太差、對於一個這麼簡單的任務所需的代碼量也是巨大的。
        針對返回值,我們可以使用Swift提供的Result類型來進行一些優化,消除第一個函數中潛在的邏輯表達瑕疵(如果不理解的話可以看看Swift爲什麼引入Result類型)。

        是時候展示一下最新的代碼的樣子了!請仔細看一下下面的代碼!雖然有些代碼你可能看不懂,但是這段代碼與上面的代碼相比,是不是簡單很多很多很多!

        函數聲明中的async標明這個函數時可以異步執行的——也就是說執行這段代碼是可以不阻塞當前線程。然後再try await語句中,異步等待從網路請求數據完成。在最後一個await中,可以異步等待通過圖片獲取縮略圖。
        請仔細閱讀以上代碼!也許你覺得這只是Swift引入了一些新的關鍵字、實現了一些新的能力,也不代表什麼!其實這種代碼的背後是有巨大的差異!非async/await代碼,就像以前沒有引入結構化程序設計時的代碼一樣,充滿了goto(在這裏指完成回調),這嚴重影響了代碼的閱讀,降低了人效!引入了async/let之後,把異步編碼結構化了,使我們可以按照自然的思維習慣去實現功能、編寫代碼。進步是巨大的!

二、async/await分析

        除了上面代碼所展示的——函數/方法可以是異步的,屬性也可以是異步的。



        在函數、屬性和初始值設定項中,await 可用於表達式可以解除當前線程阻塞;除此之外,await還可以用於異步序列。


        關於async/let的說明。


  • 當您將函數標記爲異步時,您就允許它掛起。當一個函數掛起自己時,它也會掛起它的調用者。所以它的調用者也必須是異步的。
  • 爲了指出異步函數中它可能掛起一次或多次的位置,使用了 await 關鍵字。
  • 當異步函數被掛起時,線程不會被阻塞。
  • 當異步函數恢復時,從它調用的異步函數返回的結果流回原始函數,並從上次停止的地方繼續執行。

三、async/await應用相關

3.1 基於SwiftUI的應用

3.2 既有的完成處理程序&Delegate

        蘋果對現存的以完成回調、代理返回的方法都進行了處理,以支持此種新特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章