解析嵌套完成处理程序

解析嵌套完成处理程序

问题描述:

我想在for循环中使用完成处理程序。问题在于它会在完成处理程序返回之前继续运行循环,因为它是异步调用。附件是我的代码。我需要使用GCD吗?我很新(很明显)是swift/ios。任何意见将不胜感激。鲍勃解析嵌套完成处理程序

for srcTerm in sFields { //search using all search fields 

     multiQuery (searchTerm: srcTerm) { 

      if srResult.count < self.lastValue { 
       self.lastValue = srResult.count 
       self.lastSearch = srcTerm 
      } 
     } 
     // Do more stuff 
    } 


    func multiQuery (searchTerm: String, completion: @escaping ([PFObject]) ->()) { 

     var exArray = [PFObject]() 
     let query = PFQuery(className: "searchLinks") 

     do { 

      query.whereKey("searchTerms", equalTo: searchTerm) 

      query.findObjectsInBackground (block: { (objects, error)-> Void in 
       if let error = error { 
        print("Error Generated: ",error) 
        return 
       } 
       if let objects = objects { 
        // do stuff 
       } 
       completion(self.srResult) 
      }) 
     } 
    }    // end of function 
+0

有有几种方法可以做到这一点(派遣组织,承诺等)。看看在https://stackoverflow.com/a/23112134/2124535 – nathan

+0

可能重复[GCD与嵌套解析查询](https://stackoverflow.com/questions/31347407/gcd-with-nested-parse-queries ) – nathan

+0

在完成所有查询后你想做什么?上面提到的问题/响应(第二个)似乎就像你在找什么,尽管API已经在Swift 3中更新了一点。 – nathan

你可以使用DispatchGroups,这里是一个例子(摘自https://medium.com/@wilson.balderrama/how-to-use-dispatchgroup-gdc-with-swift-3-35455b9c27e7类似GCD with nested Parse Queries但更新斯威夫特3 API):

// Just a sample function to simulate async calls 
func run(after seconds: Int, closure: @escaping() -> Void) { 
    let queue = DispatchQueue.global(qos: .background) 
    queue.asyncAfter(deadline: .now() + .seconds(seconds)) { 
     closure() 
    } 
} 

let group = DispatchGroup() 

group.enter() 
run(after: 6) { 
    print("Hello after 6 seconds") 
    group.leave() 
} 

group.enter() 
run(after: 3) { 
    print("Hello after 3 seconds") 
    group.leave() 
} 

group.enter() 
run(after: 1) { 
    print("Hello after 1 second") 
    group.leave() 
} 


group.notify(queue: DispatchQueue.global(qos: .background)) { 
    print("All async calls were run!") 
} 

使用代码:

let group = DispatchGroup() 

for srcTerm in sFields { //search using all search fields 
    group.enter() 
    multiQuery (searchTerm: srcTerm) { 
     if srResult.count < self.lastValue { 
      self.lastValue = srResult.count 
      self.lastSearch = srcTerm 
     } 
     group.leave() 
    } 
} 

group.notify(queue: DispatchQueue.global(qos: .background)) { 
    // Do something after all async calls are done 
} 
+0

谢谢纳森!我没有意识到这一点。谢谢。 –