IOS- swift : OrPredicate in CloudKit results in invalid

标签 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 == %@", 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)

但是它抛出了下面的错误。看起来它被正确评估了,为什么它错了!?

*** Terminating app due to uncaught exception 'CKException', reason: 'Invalid predicate: (user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") (Error Domain=CKErrorDomain Code=12 "(user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") is not a comparison predicate" UserInfo={NSLocalizedDescription=(user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") is not a comparison predicate, ck_isComparisonError=true})'

最佳答案

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"])

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

如果查询变得更加复杂并且无法进行 in 查询,那么您可以执行 2 个查询并合并结果。

关于IOS- swift : OrPredicate in CloudKit results in invalid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37202096/

相关文章:

ios - 具有自定义 View 的灵活表格 View 单元格

ios - 为什么我无法在调试器中打印该变量的值?

ios - NSMutableData 错误

ios - 在 Objective C 中使用 NSPredicate 过滤自定义对象数组

ios - 在 UIImagePickerController 上放置滑动手势

ios - Swift: fatal error :在初始化 UIlabel 值时展开可选值时意外发现 nil

swift - 如何在 Swift 中传递和获取多个 URL QueryItem?

ios - 快速优雅地迭代 CoreData 关系?

cocoa - NSPredicate 内存问题

ios - NSPredicate 和 Core Data 多表查询