2015-09-06 78 views
1

我正在執行消息傳遞功能到我的快速應用程序中,它運行在Parse上,並且使用orQueryWithSubqueries方法查詢Conversation對象的方法並不像它應該的那樣工作。下面是我如何設置我的查詢:Parse或QueryWithSubqueries不能正常工作(swift)

var user1 = PFQuery.getUserObjectWithId("someUserObjectID") 
    var user2 = PFQuery.getUserObjectWithId("otherUserObjectID") 

    var query1 = PFQuery(className: "Conversation") 
    query1.whereKey("user1", equalTo: user1!) 
    query1.whereKey("user2", equalTo: user2!) 
    var query2 = PFQuery(className: "Conversation") 
    query2.whereKey("user1", equalTo: user2!) 
    query1.whereKey("user2", equalTo: user1!) 

    var query = PFQuery.orQueryWithSubqueries([query1, query2]) 
    query.includeKey("user1") 
    query.includeKey("user2") 
    query.getFirstObjectInBackgroundWithBlock { 
     (object: PFObject?, error: NSError?) -> Void in 
     if (error == nil) { 
      println("Found conversation object!") 
     } else { 
      var errorCode = error!.code 
      if (errorCode == 101) { 
       println("Did not find conversation object!") 
      } else { 
       println("Unknown error occurred.") 
      } 
     } 
    } 

本質上說,在我的方案中Conversation對象是PFObject兩個相關領域:user1user2 ...它只是定義了兩個用戶的談話之間。我需要這個查詢工作的原因是,當一個用戶想和朋友一起開始一個新的Conversation ...我首先檢查Conversation是否存在,這個查詢是我如何做到的。因爲我不知道是誰開始了Conversation,所以我需要檢查兩個用戶字段中的兩個用戶(我的應用程序會自動填充user1字段與誰開始對話)。

無論如何,這裏是奇怪的行爲發生的地方。我在雲中的談話對象,其中:

user1 = someUser 
user2 = otherUser 

如果我跑我的查詢它上面鍵入...的Conversation對象不被orQueryWithSubqueries(發現的方式,即使query1應該找到Conversation對象!)。但是,如果我從orQueryWithSubqueries中刪除query2,或者甚至只是註釋掉query2中的whereKey約束...找到Conversation對象。這很奇怪,因爲query2甚至不應該找到Conversation對象!因爲query1是匹配對象的那個,並且orQueryWithSubqueries應該返回與任一查詢匹配的對象。任何人都可以闡明我做錯了什麼嗎?

回答

0

萬一別人遇到這種問題,我從來沒有找到一個辦法讓orQueryWithSubqueries正常工作(可能是在解析的iOS SDK中的錯誤),但這是我的解決方法:

var query = PFQuery(className: "Conversation") 
    query.whereKey("user1", containedIn: [user1, user2]) 
    query.whereKey("user2", containedIn: [user1, user2]) 

    query.getFirstObjectInBackgroundWithBlock { 
     (object: PFObject?, error: NSError?) -> Void in 
     if (error == nil) { 

     } else { 
      var errorCode = error!.code 
      if (errorCode == 101) { 

      } else { 
       // Handle error here. 
      } 
     } 
    }