- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在后台线程上运行的类中使用 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 提交到目标队列,但它不一定会在那之后立即开始——可能会运行,例如,带有
block 。.barrier
标志的 >async
更新:使用 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/
我是一名优秀的程序员,十分优秀!