我对如何实现这一目标感到困惑。
我想调用一个函数 (func1),该函数将调用 func2,后者执行一些 Parse 查询并将它们提交到数据库。
一旦所有这些查询都完成并且 func2 完全运行完毕,我想运行 func3 来执行类似的任务。
我想在 func3 完全运行完毕后更新我的 tableView,但我在使用 GCD 时运气不好。
我的问题是当我调用 func1() 然后等待组完成时,在执行 func3 之前执行 tableview 重新加载数据函数。
解决这个问题的最佳方法是什么?
let group = DispatchGroup()
let queue1 = DispatchQueue()
let queue2 = DispatchQueue()
let queue3 = DispatchQueue()
func1(){
queue1.async(group: group){
for i in 0...10 {
func2(i)
}
}
group.notify(queue: queue2){
func3()
}
}
func2(i: Int){
queue2.async(group: group){
// Perform query for value i
PFQuery.findObjectsInBackground {}
}
}
func3(){
queue3.async(group: group){
PFQuery.findObjectsInBackground {}
}
}
func1()
group.notify(queue: queue4){
tableView.reloadData()
}
简化:
- func1() 在 for 循环中多次调用 func2()。
- 所有的 func2() 调用必须在 func3() 开始之前完成
- func3() 必须在 tableview 重新加载之前完成。
最佳答案
您是否应该为所有异步计算创建一个类似于组合的单一方法。这使您可以轻松控制。是的,您应该仅在最后一次通话后调用通知。
func func1(){
queue1.async(group: group){
print("Some work in background queue 1")
}
}
func func2(){
queue2.async(group: group){
print("Some work in background queue 2")
}
}
func func3(){
group.notify(queue: queue3) {
print("Some work in background queue 3")
}
}
func doCompositeOperations() {
func1()
func2()
DispatchQueue.main.async(group: group) {
print("Reloading after all")
}
func3()
}
doCompositeOperations()
我认为 func1, func2 func3 ... 也在它自己的队列中执行一些异步操作,并在完成处理程序中返回结果。在这种情况下,您可以更好地控制,我更喜欢进入和离开调度组的变体。
关于Swift 3 GCD 和解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43925559/