gpt4 book ai didi

ios - 通过 DispatchGroup 与 DispatchQueue 访问主队列

转载 作者:搜寻专家 更新时间:2023-11-01 06:13:57 24 4
gpt4 key购买 nike

我在后台线程上运行的类中使用 DispatchGroup。偶尔需要更新UI,所以调用如下代码:

dispatchGroup.notify(queue: .main) {
self.delegate?.moveTo(sender: self, location: location)
self.delegate?.updateLabel(sender: self, item: self.currentItem)
}

不幸的是,没有任何反应。但是,如果我通过 DispatchQueue.main.async { } 调用相同的代码,如下所示:

DispatchQueue.main.async {
self.delegate?.moveTo(sender: self, location: location)
self.delegate?.updateLabel(sender: self, item: self.currentItem)
}

...委托(delegate)调用已完成。我的印象是 dispatchGroup.notify(queue: .main) { } 等同于 DispatchQueue.main.async { }

为什么它们不一样?

最佳答案

当您调用 notify(queue:) 时,您的 dispatchGroup 是否为空(即没有任何 block 在运行)?如果不是,如 documentation声明 dispatchGroup.notify(queue:)

Schedules a work item to be submitted to a queue when a group of previously submitted block objects have completed.

这意味着你的闭包只会在最后一次 leave() 调用之后,当组变空时执行。当然,enter()leave() 必须保持平衡。

考虑以下示例:

let group = DispatchGroup()

group.enter()
someLongRunningTask() {
// completion callback
group.leave()
}

group.enter()
anotherLongRunningTask() {
// completion callback
group.leave()
}

group.notify(queue: .main) {
print("all set")
}

在此示例中,all set 将仅在使用 group.leave() 执行两次回调后打印。

另一方面,DispatchQueue.main.async() 立即将 block 提交到目标队列,但它不一定会在那之后立即开始——可能会运行,例如,带有 .barrier 标志的 >async block 。

更新:使用 DispatchQueue 实现上面的示例(希望它能让事情变得清晰):

let group = DispatchGroup()

group.enter()
someLongRunningTask() {
// completion callback
group.leave()
}

group.enter()
anotherLongRunningTask() {
// completion callback
group.leave()
}

group.wait() // waits synchronously for the submitted work to complete
DispatchQueue.main.async {
print("all set")
}

关于ios - 通过 DispatchGroup 与 DispatchQueue 访问主队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49286984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com