Два ограничения на один ключ в запросе на синтаксический анализ

Я использую Parse, и мое приложение написано на Swift. У меня есть приложение для гольфа, которое позволяет пользователю дружить с другими пользователями. Пользователи могут регистрировать свои результаты в гольфе, а затем просматривать свои результаты в гольф и результаты своих друзей в таблице лидеров в стиле tableViewController.

У меня проблема в том, что Parse не поддерживает два ограничения на один и тот же ключ в запросе. У меня есть функция, которая запрашивает пользователей и их оценки и сохраняет их в массиве кортежей (leadeboardData). Я пытаюсь запросить PFRelation текущего пользователя, а также текущего пользователя (переменная «friendsRelation» и константа «friendQuery»). Запрос класса I — это «GolfScorecard», где результаты хранятся в Parse. Затем я вызвал метод «whereKey» для ключа «игрока в гольф», где мой пользователь хранится в Parse. Я вызываю «whereKeymatchQuery» для моего запроса friendsRelation, а затем «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)
    }
  }
 }

person dcotter    schedule 14.12.2015    source источник
comment
Вы можете создать второй запрос для golfer==currentUser, а затем использовать orQueryWithSubQueries для объединения двух запросов.   -  person Paulw11    schedule 15.12.2015


Ответы (1)


Спасибо, Paulw11, orQueryWithSubQueries сработал. Единственная проблема, которую он в конечном итоге представил, заключалась в том, что мое приложение зависало с ошибкой, указывающей: «Ключ «имя пользователя» не имеет данных». Вызовите fetchIfNeeded, прежде чем получить его значение. '... Я не думаю, что запрос Parse возвращался вовремя, чтобы загрузить в tableView, в который я помещал данные. В итоге я использовал метод 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)
    }
   }
 }
person dcotter    schedule 15.12.2015