IOS-Swift:或CloudKit中的预测结果无效

IOS-Swift:或CloudKit中的预测结果无效,ios,swift,nspredicate,cloudkit,Ios,Swift,Nspredicate,Cloudkit,我使用此位检索两个用户之间的所有消息: let user1 = "john" let user2 = "mark" let predicateUser1To2 = NSPredicate(format: "user1 == %@", user1) let predicateUser2From1 = NSPredicate(format: "user2 == %@", user2) let predicateUser2To1 = NSPredicate(format: "user2 == %@"

我使用此位检索两个用户之间的所有消息:

let user1 = "john"
let user2 = "mark"
let predicateUser1To2 = NSPredicate(format: "user1 == %@", user1)
let predicateUser2From1 = NSPredicate(format: "user2 == %@", user2)

let predicateUser2To1 = NSPredicate(format: "user2 == %@", user1)
let predicateUser1From2 = NSPredicate(format: "user1 == %@", user2)

let predicate1To2 = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateUser1To2, predicateUser2From1])
let predicate2To1 = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateUser1From2, predicateUser2To1])
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate1To2, predicate2To1])

let query = CKQuery(recordType: "Chat", predicate: predicate)
但它在下面抛出了错误。它似乎得到了正确的评估,为什么它是错误的

***由于未捕获的异常“CKException”而终止应用程序,原因: '无效谓词:(user1==“john”和user2==“mark”)或(user1== “mark”和user2==“john”)(错误域=CKErrorDomain代码=12 “(user1==“john”和user2==“mark”)或(user1==“mark”和user2) ==“john”)不是比较谓词“UserInfo={NSLocalizedDescription=(user1==“john”和user2==“mark”) 或者(user1==“mark”和user2==“john”)不是比较 谓词,ck_isComparisonError=true}'


CloudKit不支持或查询。有关更多信息,请参阅:

在很多情况下,您可以通过在谓词中使用
来解决这个问题,但这只适用于一个字段。在你的情况下,你可以考虑一个谓词,比如:

NSPredicate(format: "user1 in %@ AND user2 in %@", ["john", "mark"], ["john", "mark"])
这个和你的样品还是不完全一样。可能是user1与user2相同。例如,两者都可以是马克。在您的情况下,该记录未被选中,而在上面的示例中,它已被选中。您可以添加一个额外的AND条件来排除这些。您可以添加:
和user1!=用户2


如果一个查询变得更复杂,并且无法在
查询中执行一个
,那么您可以执行两个查询并合并结果。

一个简单的替代方法当然是执行单独的查询和to或它们的结果。