原本要繼續做點名系統但是發現有問題正在除錯,所以先把後面要放的東西難道前面放.
當你執行像是 API 請求、圖片下載或大型資料計算時,這些操作如果在主執行緒上執行,會導致 UI 卡頓、App 無反應(甚至被系統強制關閉)。為了改善這種問題,我們使用「非同步處理」來把耗時任務移到背景執行緒,讓主執行緒保持流暢。
async/await
是 Swift Concurrency 的核心語法,可以讓非同步程式碼變得像同步一樣好讀。
async:表示這個closure會用非同步異步的方式執行
await:表是暫停點接下來的內容可以
被暫停稍後再執行
範例:網路請求
func fetchData() async throws -> Data {
let url = URL(string: "https://api.example.com/data")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
async/task:都能用來建立一段異步執行的空間
task之中的任務獨立於原本的同步執行空間
範例:呼叫 async 函式
Task {
do {
let data = try await fetchData()
print("成功取得資料:\(data)")
} catch {
print("錯誤:\(error)")
}
}
在主執行緒執行
範例三種寫法
@MainActor
func dog(){
}
Task { @MainActor in
dog()
}
Task {
await MainActor.run{
dog()
}
}
永遠不要在背景執行緒更新 UI,應使用 DispatchQueue.main.async {}。
避免死鎖:不要同步(sync)地呼叫主執行緒內部邏輯。
記憶體管理:非同步閉包內使用 self 時記得 [weak self],避免循環引用。
測試非同步程式:XCTest 支援 async 測試方法,例如 async throws。