我刚刚开始在 Swift 编程语言中学习更多关于 Grand Central Dispatch 的知识。
我按照在线教程更好地理解 GCD 并尝试了各种使用示例......
在有关工作项的部分中,我编写了以下代码:
func useWorkItem() {
var value = 10
let workItem = DispatchWorkItem {
value += 5
}
workItem.perform()
let queue = DispatchQueue.global(qos: .utility)
queue.async(execute: workItem)
workItem.notify(queue: DispatchQueue.main) {
print("value = ", value)
}
}
该代码基本上在两个不同的队列(主队列和全局队列)中执行工作项,当工作项在两个队列中完成运行时,我得到了结果。
上面代码的输出是:20。
当我尝试稍微操作代码并将另一个队列添加到混合中并运行与qos
全局队列(.utility
)相同的相同工作项时,如下所示:
func useWorkItem() {
var value = 10
let workItem = DispatchWorkItem {
value += 5
}
workItem.perform()
let queue = DispatchQueue.global(qos: .utility)
queue.async(execute: workItem)
let que = DispatchQueue(label: "com.appcoda.delayqueue1", qos: .utility)
que.async(execute: workItem)
workItem.notify(queue: DispatchQueue.main) {
print("value = ", value)
}
}
应用程序崩溃。
但是当我更改命令的顺序时,我将方法移动到workItem.notify
方法的开头,应用程序工作并给我正确的输出,即 25 :
func useWorkItem() {
var value = 10
let workItem = DispatchWorkItem {
value += 5
}
workItem.notify(queue: DispatchQueue.main) {
print("value = ", value)
}
workItem.perform()
let queue = DispatchQueue.global(qos: .utility)
queue.async(execute: workItem)
let que = DispatchQueue(label: "com.appcoda.delayqueue1", qos: .utility)
que.async(execute: workItem)
}
任何人都可以帮助了解该.notify()
方法的实际工作原理吗?为什么命令的顺序有所不同?
非常感谢提前...