我收到了很多資料,想在主執行緒之外處理它。大多數事情本質上可能是異步的,但是有時每次更新都會導致關鍵資料進入,使之前的迭代無效。目前我設定了這樣的一切:
func onReceivedData(d: Data){ //is on main thread unfortunately
//some work 1
DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
//some work 2
if(saveToFile) {
DispatchQueue.global(qos: DispatchQoS.QoSClass.utility).async {
//UserDefaults write
}
}
}
}
現在我不確定我是否正確理解了 DispatchQueue。當資料A在資料B之前進入時,是否有可能由于某種原因資料B可能UserDefaults write比資料A更早到達?DispatchQueues 以串行方式推送操作還是它們也可以并行操作,可能在資料 A 之前寫入資料 B,使 UserDefaults 處于無效狀態?
uj5u.com熱心網友回復:
從Apple Developer 檔案中DispatchQueue.global():
提交到回傳佇列的任務是相互并發調度的。
這意味著global()佇列是并發調度佇列。如果您想確保任務按照您安排的順序執行,您應該創建自己的 serial DispatchQueue。
let queue = DispatchQueue(label: "my-queue")
queue.async {
// Work 1...
}
queue.async {
// Work 2...
}
“作業 1”將始終在此串行佇列中的“作業 2”之前運行(并發佇列可能不是這種情況)。
或者,您可以考慮使用 Swift actor,它可以以記憶體安全的方式更有效地控制對共享可變狀態的訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366705.html
