2015-12-14 32 views
1

我正在使用Parse,而我的應用程序是用Swift編寫的。我有一個高爾夫應用程序,允許用戶與其他用戶進行交流。用戶可以記錄他們的高爾夫分數,然後在排行榜樣式tableViewController中看到他們的高爾夫分數和他們的朋友的分數。解析查詢中一個鍵的兩個約束

我遇到的問題是Parse不支持查詢中同一個鍵上的兩個約束。我有一個函數查詢用戶和他們的分數,並將它們存儲在一個元組數組(leadeboardData)中。我試圖查詢當前用戶的PFRelation以及當前用戶(變量「friendsRelation」和常量「friendQuery」)。我查詢的類是「GolfScorecard」,這是將分數存儲在Parse中的地方。然後,我在「高爾夫球手」鍵上調用「whereKey」方法,這是我的用戶在Parse下存儲的地方。我爲我的friendsRelation查詢調用「whereKey matchesQuery」,然後「whereKey equalTo」嘗試獲取當前用戶。然後我「包含鍵」「高爾夫球手」,這樣我就可以得到用戶信息以及得分信息。有關如何解決這個問題的任何建議?我試圖在一個查詢中完成所有操作,但是當在同一個鍵(「高爾夫球手」)上調用「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) 
    } 
    } 
} 
+0

您可以創建'高爾夫球手== currentUser'第二查詢,然後使用'orQueryWithSubQueries'你合併這兩個查詢 – Paulw11

回答

1

感謝Paulw11的orQueryWithSubQueries工作。它最終呈現的唯一問題是我的應用程序崩潰,並顯示一個錯誤,指出「密鑰」用戶名「沒有數據。在獲取它的值之前調用fetchIfNeeded。'..我不認爲Parse查詢會及時加載到我正在將數據放入的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) 
    } 
    } 
}