具有嵌套分析查询的GCD

时间:2015-07-10 18:02:48

标签: ios swift parse-platform grand-central-dispatch

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 Queries,针对不同的类,并根据提供的数据创建TableViewCells。这工作正常,但由于我不希望在用户滚动表时加载数据,我想预加载数据并创建单元格,并将它们存储在数组中。由于我想删除任何活动指示,并重新加载表格,当提取完成时,我虽然(在谷歌之后),调度组可能是一个很好的解决方案。但是,“所有完成”永远不会在控制台中打印出来。

当我围绕外部查询创建一个调度组(在查询之前输入组,并作为块中的最后一行)时,该工作正常。我究竟做错了什么?嵌套异步调用时是否无法使用它?

仅供参考,我删除了很多代码,比如创建单元格并使用Parse中的数据,因为我想让你免于阅读那些混乱。

1 个答案:

答案 0 :(得分:2)

此调度组模式基本上是正确的。

我建议在dispatch_group_enterdispatch_group_leave处记录一些消息,看看它是否按照您认为的那样被调用,并且每个enter都被{{ {1}}。

如果leave的出现次数少于dispatch_group_leave的次要值,则dispatch_group_enter块将不会被调用。

也许你在内部dispatch_group_notify闭包中有一些路径阻止它进入findObjectsInBackgroundWithBlock调用。