Swift 3 GCD 和解析

标签 swift asynchronous parse-platform

我对如何实现这一目标感到困惑。

我想调用一个函数 (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()
}

简化:

  1. func1() 在 for 循环中多次调用 func2()。
  2. 所有的 func2() 调用必须在 func3() 开始之前完成
  3. 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/

相关文章:

ios - 如何在 iOS 中制作自定义文件夹/相册

ios - 当选择单元格时,TableVIew 中的 UIImage 会移动

SwiftUI:ObservableObject 在重绘时不会保持其状态

ios - 迁移后解析未授权登录

ios - 如何使用 ObjectId 数组从 Parse 中检索用户数组?

android - 包含 doesNotMatchQuery 的 Parse.com 嵌套查询

arrays - 在 Swift 中从数组中获取多个元素的更快方法?

Javascript - 等待数组完成填充

javascript - 如何保持 $.getJSON 响应的顺序?

c++ - WaitCommEvent 在第二次传递时失败无效参数