我正在尝试在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
}
}
有没有办法确定执行这些查询的顺序?对此问题的任何帮助将不胜感激。
答案 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
}