1

我正在使用 Parse,我的应用程序是用 Swift 编写的。我有一个高尔夫应用程序,允许用户与其他用户成为朋友。用户可以记录他们的高尔夫分数,然后在排行榜样式的 tableViewController 中查看他们的高尔夫分数和他们朋友的分数。

我遇到的问题是 Parse 不支持查询中同一键的两个约束。我有一个函数可以查询用户及其分数并将它们存储在一个元组数组(leaderboardData)中。我正在尝试查询当前用户的 PFRelation 以及当前用户(变量“friendsRelation”和常量“friendQuery”)。我查询的类是“GolfScorecard”,它是 Parse 上存储分数的地方。然后我在“golfer”键上调用了“whereKey”方法,这是我的用户在 Parse 上的存储位置。我为我的朋友关系查询调用“whereKey matchesQuery”,然后调用“whereKey equalTo”来尝试获取我当前的用户。然后我“includeKey”“golfer”,这样我就可以获得用户信息和分数信息。关于如何解决这个问题的任何建议?我试图在一个查询中完成所有操作,但是当在同一个键(“golfer”)上调用“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)
    }
  }
 }
4

1 回答 1

1

感谢 Paulw11 orQueryWithSubQueries 工作。它最终出现的唯一问题是我的应用程序崩溃并出现错误,指出“密钥“用户名”没有数据。在获取其值之前调用 fetchIfNeeded。'...我认为 Parse Query 没有及时返回以加载我正在放入数据的 tableView。我最终在 cellForRowAtIndexPath 中使用了 'fetchIfNeededInBackgroundWithBlock' 方法调用我调用“用户名”数据的代码。如果数据没有及时返回,这允许它在后台获取数据。这似乎是由于诡计。

-我还对我的查询进行了子类化,这就是 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)
    }
   }
 }
于 2015-12-15T04:30:38.863 回答