带有嵌套解析查询的 GCD
GCD with nested Parse Queries
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")
}
}
}
}
}
所以,我不确定我是否误解了调度组,但我的意图是进行两个解析查询,针对不同的 类,并根据提供的数据创建 TableViewCells。这工作正常,但由于我不希望在用户滚动 table 时加载数据,我想预加载数据并创建单元格,并将它们存储在数组中。因为我想删除任何 Activity 指示,并重新加载 table,所以在获取完成时我虽然(在谷歌搜索之后)调度组可能是一个很好的解决方案。但是,"All done" 永远不会在控制台中打印出来。
当我围绕外部查询创建一个调度组时(在查询之前进入组,并作为块中的最后一行离开)工作正常。我究竟做错了什么?嵌套异步调用的时候不能用这个吗?
仅供参考,我删除了很多代码,例如创建单元格和使用来自 Parse 的数据,因为我不想让您阅读那些乱七八糟的东西。
这个dispatch group模式基本上是对的。
我建议在 dispatch_group_enter
和 dispatch_group_leave
处记录一些消息,看看它是否像您认为的那样被调用,并且每个 enter
都被 [=13] 偏移=].
如果 dispatch_group_leave
的出现次数少于 dispatch_group_enter
的调用次数,则不会调用 dispatch_group_notify
块。
也许您在内部 findObjectsInBackgroundWithBlock
闭包中有一些路径阻止它触发 dispatch_group_leave
调用。
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")
}
}
}
}
}
所以,我不确定我是否误解了调度组,但我的意图是进行两个解析查询,针对不同的 类,并根据提供的数据创建 TableViewCells。这工作正常,但由于我不希望在用户滚动 table 时加载数据,我想预加载数据并创建单元格,并将它们存储在数组中。因为我想删除任何 Activity 指示,并重新加载 table,所以在获取完成时我虽然(在谷歌搜索之后)调度组可能是一个很好的解决方案。但是,"All done" 永远不会在控制台中打印出来。
当我围绕外部查询创建一个调度组时(在查询之前进入组,并作为块中的最后一行离开)工作正常。我究竟做错了什么?嵌套异步调用的时候不能用这个吗?
仅供参考,我删除了很多代码,例如创建单元格和使用来自 Parse 的数据,因为我不想让您阅读那些乱七八糟的东西。
这个dispatch group模式基本上是对的。
我建议在 dispatch_group_enter
和 dispatch_group_leave
处记录一些消息,看看它是否像您认为的那样被调用,并且每个 enter
都被 [=13] 偏移=].
如果 dispatch_group_leave
的出现次数少于 dispatch_group_enter
的调用次数,则不会调用 dispatch_group_notify
块。
也许您在内部 findObjectsInBackgroundWithBlock
闭包中有一些路径阻止它触发 dispatch_group_leave
调用。