iOS-Swift:CloudKit中的OrPredicate导致无效

use*_*042 3 nspredicate ios swift cloudkit

我有这一点来检索两个用户之间的所有消息:

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)
Run Code Online (Sandbox Code Playgroud)

但这会引发以下错误。看来它得到正确的评估,为什么会出错!?

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

Edw*_*eer 6

CloudKit不支持OR查询。有关更多信息,请参见:https : //developer.apple.com/library/ios/documentation/CloudKit/Reference/CKQuery_class/

在很多情况下,您可以使用in谓词解决此问题,但这仅适用于一个字段。在您的情况下,您可以考虑以下谓词:

NSPredicate(format: "user1 in %@ AND user2 in %@", ["john", "mark"], ["john", "mark"])
Run Code Online (Sandbox Code Playgroud)

这个仍然与您的样本不完全相同。可能是user1与user2相同。例如,两者都可能是标记。在您的情况下,该记录未被选中,而在上面的示例中该记录被选中。您可以添加一个额外的AND条件以排除那些。您可以添加:AND user1 != user2

如果查询变得更复杂而in无法进行查询,则可以执行2个查询并合并结果。