#作業練習【ChaoCode】 Swift 中級篇 17:Asynchronous 作業

Dong
4 min readDec 6, 2022

--

題目取自於 : ChaoCode 頻道

  1. Synchronous 和 Asynchronous 的差別是什麼?
Synchronous 的 code 全部都會依序執行;
Asynchronous 的 code 可以把需要等待的任務拆開,
讓可以完成的部分馬上完成後就「暫時」離開 thread,稍後再繼續。
(解答)

2.「理想上」一個程式裡會有幾個 Thread?

3. 在哪些地方可以寫 Asynchronous code?

Task 中和 async closure 中。(解答)

4. 寫 await 的地方表示在這裡暫停嗎?

表示可能有暫停點,但不一定會暫停。

5. 看到 await 要注意什麼?

await 的地方表示「可能經過了一段暫停的時間」,
所以不能預期程式中的情況依然和 await 之前一樣。
(解答)

6. Main Thread 使用有什麼要注意的?

 Main Thread 主要用來更新 UI,確保一切照順序執行,
不應該在這個 Thread 太複雜太久的運算,會卡住 UI。
(解答)

7. 可以怎麼進入 Main Thread?

可以在 closure 前方加上 @MainActor,或是使用 MainActor.run { }
(解答)

Notes:

一般程式執行程序-

CPU的工作執行- UI更動會在 Main Thread作處理

Asyncchronous & Synchronous -

Asyncchronous ( 非同時發生、異步 )

Synchronous ( 同時發生 、 同步 )

MainActor-(回到主執行序上更動UI)

範例: (下載圖片)

import Foundation
import _Concurrency
import AppKit


let randomImageUrl = URL(string: "https://random.imagecdn.app/300/300")!

// 示範使用 fatalError(""),正常會throw error
func downloadImage() async throws -> NSImage {
let (data, response) = try await URLSession.shared.data(from: randomImageUrl)
guard let response = response as? HTTPURLResponse,
(200...299).contains(response.statusCode) else {
fatalError("")
}
return NSImage(data: data)!
}

Task {
try! await downloadImage()
}

官方推薦-

// 原先:

DispatchQueue.main.async{

}


// 改為:

Task.detached { @MainActor in

}

實作:

第一題:

第二題:

解答:

第一題解答
第二題解答

--

--