我URLSession.shared.dataTask(with:completionHandler:)
用來訪問在某些情況下不會立即回應的 API。我還需要在某些條件下取消待處理的請求。
我當前的實作使用了這種completionHandler
方法,多個請求可以并行發生。這使得將模式更改為委托非常不方便。
我正在嘗試將每個待處理的任務存盤在一個集合中,然后在完成后從集合中洗掉該任務。問題是從完成處理程式內部訪問 dataTask 的回傳似乎非常麻煩,以至于我不確定這是否正確。
class API {
private var tasks: Set<URLSessionTask> = []
func sendRequest(path: String, body: [String: Any], completionHandler: @escaping @Sendable (APIResponse) -> Void) {
var request = // ... create request
let task = URLSession.shared.dataTask(with: request) { [self] data, response, error in
// ... handle response
tasks.remove(task)
}
tasks.insert(task)
task.resume()
}
func cancelAllTasks() {
for task in tasks {
task.cancel()
tasks.remove(task)
}
}
}
我要么得到編譯器錯誤,要么得到Closure captures 'task' before it is declared
警告'task' mutated after capture by sendable closure
。
有沒有更好的方法來做到這一點?
uj5u.com熱心網友回復:
問題是您的完成處理程式試圖參考在您創建完成處理程式時尚未定義的任務。
假設您的請求是唯一的,您可以使用由 URLRequest 鍵入的資料任務字典。然后taskComplete(forRequest:)
向您的 API 類添加一個方法。讓您的完成處理程式將該訊息發送到 API 類。
API 類可以使用請求作為鍵來洗掉任務(我檢查了。URLRequest
是Hashable
.
如果您的請求不確定是唯一的,請創建一個包含 URLTask 和創建任務時的 Date 的請求結構。Date 應該使請求結構的哈希值唯一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516577.html
標籤:迅速
上一篇:Swift錯誤擴展DictionaryAny?不可轉換為組態檔
下一篇:無法轉換型別“UnsafePointer<UnsafeMutablePointer<Float>>?”的值?到預期的引數型別'UnsafePointer<Flo