我正在使用Parse,我的应用程序是用Swift编写的。我有一个高尔夫应用程序,允许用户与其他用户交朋友。用户可以记录他们的高尔夫分数,然后在排行榜风格的tableViewController中查看他们的高尔夫分数和他们朋友的分数。
我遇到的问题是Parse不支持查询中同一个键的两个约束。我有一个查询用户及其分数的函数,并将它们存储在一个元组数组中(leadeboardData)。我正在尝试查询当前用户的PFRelation以及当前用户(变量“friendsRelation”和常量“friendQuery”)。 I类查询是“GolfScorecard”,这是分数存储在Parse上的地方。然后我在“高尔夫球手”键上调用了“whereKey”方法,这是我的用户存储在Parse下的位置。我为我的friendsRelation查询调用“whereKey matchesQuery”,然后使用“whereKey equalTo”来尝试获取当前用户。然后我“includeKey”“高尔夫球手”,这样我就可以获得用户信息以及得分信息。关于如何解决这个问题的任何建议?我试图在一个查询中完成所有操作但是当在同一个键(“高尔夫球手”)上调用“whereKey”方法时,最后一个方法会覆盖第一个,这使得它只能获取朋友信息或当前用户信息,但不是两者。我很难过如何将两者都包括在内。提前谢谢。
这是我打电话来查询的函数:
func loadLeaderboardData() {
leaderboardData.removeAll()
friendsRelation = PFUser.currentUser()?.objectForKey("friendsRelation") as? PFRelation
friendsRelation = PFUser.currentUser()?.objectForKey("friendsRelation") as? PFRelation
let friendQuery = friendsRelation?.query()
let query = PFQuery(className: "GolfScorecard")
query.whereKey("golfer", matchesQuery: friendQuery!)
query.whereKey("golfer", equalTo: PFUser.currentUser()!)
query.includeKey("golfer")
query.orderByAscending("score")
query.findObjectsInBackgroundWithBlock { (scoreCards: [PFObject]?, error: NSError?) -> Void in
if error == nil {
for object:PFObject in scoreCards! {
let golfer:PFObject = object["golfer"] as! PFObject
self.leaderboardData.append(object,golfer)
dispatch_async(dispatch_get_main_queue()) {
self.leaderboardTableView.reloadData()
}
}
} else {
print(error)
}
}
}
答案 0 :(得分:1)
感谢Paulw11 orQueryWithSubQueries的工作。它最终呈现的唯一问题是我的应用程序崩溃,出现错误,表示用户名"用户名"没有数据。在获取其值之前调用fetchIfNeeded。' ...我不认为Parse Query正在及时加载到我正在放入数据的tableView中。我最终使用&#39 ; fetchIfNeededInBackgroundWithBlock' cellForRowAtIndexPath内部的方法调用我调用'用户名'的代码。数据在。如果它没有及时返回,这使它能够在后台获取数据。这似乎是由于这个伎俩。
- 我也将我的查询子类化,这就是GolfScorecard& GolferProfile来自我的for-in循环。
- 这是我的新复合查询:
func loadLeaderboardData() {
leaderboardData.removeAll()
friendsRelation = PFUser.currentUser()?.objectForKey("friendsRelation") as? PFRelation
let friendQuery = friendsRelation?.query()
let friendScorecardQuery = PFQuery(className: "GolfScorecard")
friendScorecardQuery.whereKey("golfer", matchesQuery: friendQuery!)
let currentUserScorecardQuery = PFQuery(className: "GolfScorecard")
currentUserScorecardQuery.whereKey("golfer", equalTo: PFUser.currentUser()!)
let subQuery = PFQuery.orQueryWithSubqueries([friendScorecardQuery, currentUserScorecardQuery])
subQuery.orderByAscending("score")
subQuery.findObjectsInBackgroundWithBlock { (scoreCards: [PFObject]?, error: NSError?) -> Void in
if error == nil {
for object:PFObject in scoreCards! {
if let object = object as? GolfScorecard {
let golfer = object["golfer"] as! GolferProfile
self.leaderboardData.append(object,golfer)
dispatch_async(dispatch_get_main_queue()) {
self.leaderboardTableView.reloadData()
}
}
}
} else {
print(error)
}
}
}