2015-09-06 50 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. 
      } 
     } 
    }