NSCompoundPredicate 和 Cloudkit
Posted
技术标签:
【中文标题】NSCompoundPredicate 和 Cloudkit【英文标题】:NSCompoundPredicate and Cloudkit 【发布时间】:2015-03-31 18:54:54 【问题描述】:我正在尝试使用 Cloudkit 对复合谓词执行此操作,但 Xcode 错误显示“意外表达式”。有人知道我的代码有什么问题吗?感谢任何帮助!
let userRef = CKReference(recordID: userID, action: .None)
let predicateOne = NSPredicate(format: "recordID IN %@ AND user = %@", postIDs, userRef)
// I need all user post's that match the IDs in the array and where the user ID matches the Id in the reference field for the user.
let predicateTwo = NSPredicate(format: "recordID IN %@", followIDs)
// Or I want recordID's that match the IDs in this array.
// I want records if either predicate condition is met, or both, which is why I'm using an OrPredicateType.
let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [predicateOne!, predicateTwo!])
let query = CKQuery(recordType: "UserPosts", predicate: predicate)
let queryOp = CKQueryOperation(query: query)
【问题讨论】:
我不明白为什么这些谓词会失败。你能包括你得到的确切错误吗? postIDs 和 followIDs 是 CKReferences 到 CKRecordIDs 的数组吗? @Marcus。这些数组是记录 ID,我正在查询这些记录 ID 的元数据索引。 userRef 变量是一个 CKReference。 我有一个类似的谓词给我带来了麻烦,我将它从一个 recordID 数组更改为一个 CKReferences 数组,然后我的谓词开始工作。不确定这是否有助于您的复合谓词,但值得一试。 【参考方案1】:对于 CloudKit 使用 NSPredicate 有一些规则。有关详细信息,请参阅Apple documentation
你可以尝试像这样创建谓词:
NSPredicate(format: "recordID IN %@ OR (recordID IN %@ AND user = %@)", followIDs, postIDs, userRef)
但是我在使用带有 AND 和 OR 语句的谓词方面有不好的经验。如果这个谓词不起作用,那么我认为唯一的解决方案是执行 2 个单独的查询,然后组合结果。您可以使用 ExSwift 库中的 union 函数来做到这一点
【讨论】:
不幸的是,这不起作用,因为它给出了同样的错误,但感谢您的帮助。我会检查你提到的联合功能。 @EdwinVermeer。 您有执行多个查询的最佳实践吗?我一直在使用第一个查询中的 queryCompletionBlock 来调用另一个包含下一个查询的函数。然后我仍然不确定如果你得到一个游标该怎么办,在你运行第二个查询之前你不希望处理第一批记录。我听说过使用依赖项。欣赏你的任何想法。 @EdwinVermeer 这就是我通常的做法。 (从完成块中调用第二个)。当您想使用游标连续执行查询时,请尝试以递归方式编写它(如果游标然后调用 self 否则调用第二个查询)您可以使用承诺或期货来简化这一点。见github.com/Thomvis/BrightFutures 或github.com/ReactKit/SwiftTask 除此之外,我当然使用github.com/evermeer/EVCloudKitDao 完成我所有的CloudKit 工作 CloudKit 不允许连接,因此不允许使用带有 OR 的复合谓词(不要试图巧妙地使用“AND NOT”)。您必须运行两个单独的查询并自己加入结果。 感谢 Edwin 提供的所有资源。作为一个新开发人员,我在使用 CloudKit 时肯定遇到了很多问题,并且只知道 Swift 而不是 Obj-C,因为那里没有太多文档。我很好奇你发现什么对使用 EVCloudKitDao 最有帮助,而不是自己动手。 @埃德温维米尔以上是关于NSCompoundPredicate 和 Cloudkit的主要内容,如果未能解决你的问题,请参考以下文章
NSPredicate 与 NSCompoundPredicate?
NSCompoundPredicate 的 NSPredicate 数组