DispatchQueue
出于學習目的,在演示專案中宣告了一個。
當我點擊按鈕時,控制臺中會列印“Statement 1”,幾秒鐘后應用程式崩潰并出現錯誤:
執行緒 8:EXC_BAD_INSTRUCTION(代碼=EXC_I386_INVOP,子代碼=0x0)
我知道異步意味著這兩件事不知道或不關心另一件事何時發生。同步意味著兩件事必須同時發生,或者,其中一件必須等到另一件趕上。
誰能解釋一下為什么應用程式崩潰了?
@IBAction func queuePrint(_ sender: UIButton) {
let queue = DispatchQueue(label: "io.myQueue.queue")
queue.async {
print("Statement 1")
queue.sync {
print("Statement 2")
queue.async {
print("Statement 3")
}
}
}
queue.async {
print("Statement 4")
}
queue.async {
print("Statement 5")
}
}
uj5u.com熱心網友回復:
你初始化 newDispatchQueue
如下:
let queue = DispatchQueue(label: "io.myQueue.queue") // Serial by default
您的佇列是Serial,只能同時運行一個 Thread 。 因此,當您在其范圍內呼叫 queue.sync (在 queue.async 中呼叫它)時,它將導致死鎖,因為 queue.sync 內沒有新執行緒來執行您的代碼,您的佇列是Serial,而不是Concurrent。串行佇列或串行調度佇列是 FIFO(先進先出)。
所以你可以把它改成這樣:
`let queue = DispatchQueue(label: "io.myQueue.queue", attributes: .concurrent)`
參考:https ://developer.apple.com/documentation/dispatch/dispatchqueue/attributes
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/506531.html