解析嵌套完成处理程序
问题描述:
我想在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
答
你可以使用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
谢谢纳森!我没有意识到这一点。谢谢。 –
有有几种方法可以做到这一点(派遣组织,承诺等)。看看在https://stackoverflow.com/a/23112134/2124535 – nathan
可能重复[GCD与嵌套解析查询](https://stackoverflow.com/questions/31347407/gcd-with-nested-parse-queries ) – nathan
在完成所有查询后你想做什么?上面提到的问题/响应(第二个)似乎就像你在找什么,尽管API已经在Swift 3中更新了一点。 – nathan