【问题标题】:Two constraints on one key in a Parse QueryParse Query 中一个键的两个约束
【发布时间】:2016-03-20 14:15:35
【问题描述】:

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

【问题讨论】:

  • 您可以为golfer==currentUser 创建第二个查询,然后使用orQueryWithSubQueries 合并您的两个查询

标签: ios swift parse-platform pfuser pfrelation


【解决方案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)
    }
   }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    相关资源
    最近更新 更多