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

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

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

1 ответ

Благодаря Paulw11 работает orQueryWithSubQueries. Единственной проблемой, с которой он столкнулся, было то, что мое приложение аварийно завершало работу с ошибкой, указывающей, что у ключа "username" нет данных. Вызовите fetchIfNeeded до получения его значения.'... Я не думаю, что запрос разбора возвращался вовремя для загрузки в tableView, в который я помещал данные. Я закончил с использованием метода 'fetchIfNeededInBackgroundWithBlock' внутри cellForRowAtIndexPath Обзвоните код, в котором я вызывал данные "username". Это позволило ему получить данные в фоновом режиме, если они не вернулись вовремя. Это, казалось, из-за уловки.

-Также я разделил свои запросы на подклассы, и именно поэтому 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)
    }
   }
 }
Другие вопросы по тегам