在Swift中,如何在PFQueryTableViewController上执行一个查询到另一个查询之前?

时间:2016-02-02 18:34:34

标签: arrays swift parse-platform

我正在尝试在PFQueryTableViewController中对Parse进行两次查询。我正在尝试执行一个查询以获取与currentUser相关的所有对象,然后将这些对象放入数组中。在数组填充其对象后,我想从

进行另一个查询
override func queryForTable() -> PFQuery { }. 

第二个查询将使用从第一个查询创建的数组中的对象,以便检索自己的对象。

我不知道如何在第二个查询之前执行第一个查询。到目前为止,第二个查询将在第一个查询之前执行,然后才有机会填充数组,结果导致查询第二个查询。以下是我现在对代码所拥有的内容。

class PFNewsFeedTableViewController: PFQueryTableViewController {

var leadersArray : NSMutableArray = NSMutableArray()

override func viewDidAppear(animated: Bool) {
    leadersArray.removeAllObjects()

    var findLeaders = PFQuery(className: "Follow")

    findLeaders.whereKey("follower", equalTo: PFUser.currentUser()!)
    findLeaders.orderByDescending("createdAt")
    findLeaders.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]?, error: NSError?) -> Void in

        //If no error
        if error == nil {

            println("Successfully retrieved \(objects!.count) leaders.")

            // Do something with the found objects
            if let objects = objects as? [PFObject] {

                for object in objects {

                    self.leadersArray.addObject(object.objectForKey("leader")!)

                }

            }

        }
        self.tableView.reloadData()

        self.queryForTable()
    }

}



override func queryForTable() -> PFQuery {

    var findContent = PFQuery(className: "Content")
    findContent.whereKey("user", containedIn: self.leadersArray as [AnyObject])
    findContent.orderByDescending("createdAt")

    return findContent
}    

}   

有没有办法确定执行这些查询的顺序?对此问题的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

是的,你可以。

首先我要说的是,听起来你应该尝试重新考虑一下你的数据模型,因为像这样连续执行两个查询通常是过分关注传统数据建模的标志,而不是更实用的nosql建模风格(尤其是移动应用程序)应该为查询建模而不是标准化。

如果你像你所说的那样解决你的案子,你可以使用this page。无需安装,因为它已经作为Parse(在幕后使用Bolts)的一部分安装。

它可能看起来像这样(只是一个快速的写作。可能不会开箱即用,但你应该能够使它适合):

var findLeaders = PFQuery(className: "Follow")
findLeaders.whereKey("follower", equalTo: PFUser.currentUser()!)
findLeaders.orderByDescending("createdAt")
findLeaders.findObjectsInBackground().continueWithBlock {
    (task: BFTask!) -> AnyObject! in

    //If no error
    if task.error != nil {
        print("Something went wrong...")
    } else {
        // Do something with the found objects
        if let objects = task.result as? [PFObject] {
            print("Successfully retrieved \(objects.count) leaders.")

            for object in objects {
                self.leadersArray.addObject(object.objectForKey("leader")!)
            }
        }
    }
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.tableView.reloadData()
    })
    self.queryForTable()
    return nil
}

答案 1 :(得分:0)

我发现了问题,看起来像这样

override func queryForTable() -> PFQuery {

    var findLeaders = PFQuery(className: "Follow")
    findLeaders.whereKey("follower", equalTo: PFUser.currentUser()!)
    findLeaders.orderByDescending("createdAt")

    var findContent = PFQuery(className: "Content")
    findContent.whereKey("user", matchesKey: "leader", inQuery: findLeaders)
    findContent.orderByDescending("createdAt")


    return findContent
}