带有嵌套Parse查询的GCD
func getPosts(skip: Int){ var query = PFQuery(className: self.parseClassName!) query.includeKey("posted_by") query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in if error == nil && objects != nil { if let objects = objects as? [PFObject] { var requestGroup = dispatch_group_create() for post in objects { dispatch_group_enter(requestGroup) let queryKommentar1 = PFQuery(className:"Comment") queryKommentar1.whereKey("posted_to", equalTo: post) queryKommentar1.limit = 3 queryKommentar1.includeKey("written_by") queryKommentar1.findObjectsInBackgroundWithBlock() { (commentObjects: [AnyObject]?, error: NSError?) -> Void in //Creating UITableViewCells from data and store in array dispatch_group_leave(requestGroup) } } println("Successfully retrieved \(objects.count) posts.") dispatch_group_notify(requestGroup, dispatch_get_main_queue()) { println("All done") } } } } }
所以,我不确定是否误解了派遣组,但是我的意图是做两个Parse查询,针对不同的类,并从提供的数据创buildTableViewCells。 这工作正常,但由于我不希望在用户滚动表时加载数据,我想预加载数据并创build单元格,并将它们存储在一个数组中。 因为我想删除任何活动指示,并重新加载表,到提取完成时,我虽然(谷歌之后)调度组可能是一个很好的解决scheme。 但是,“全部完成”绝不会在控制台中打印。
当我围绕外部查询(在查询之前input组,并作为块的最后一行离开组)进行调度组工作正常。 我究竟做错了什么? 嵌套asynchronous调用时不可能使用它吗?
仅供参考,我删除了很多代码,比如创build单元格并使用Parse中的数据,因为我想让您不要阅读这些混乱。
这个派遣小组模式基本上是对的。
我build议在dispatch_group_enter
和dispatch_group_leave
logging一些消息,看看它是否按照你认为的那样被调用,并且每一个enter
都被一个leave
所抵消。
如果dispatch_group_leave
的出现次数less于dispatch_group_leave
的调用次数,则不会调用dispatch_group_notify
块。
也许你在内部的findObjectsInBackgroundWithBlock
闭包中有一些path阻止它进入dispatch_group_leave
调用。