Parse查询中一个键的两个约束

时间:2015-12-14 23:04:18

标签: ios swift parse-platform pfuser pfrelation

我正在使用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)
    }
  }
 }

1 个答案:

答案 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)
    }
   }
 }