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的主要内容,如果未能解决你的问题,请参考以下文章

NSCompoundPredicate

将 NSCompoundPredicate 与列表一起使用

NSPredicate 与 NSCompoundPredicate?

NSCompoundPredicate 的 NSPredicate 数组

Xcode 6.1 中的 NSCompoundPredicate 错误

在 swift 3 中创建复杂的 NSCompoundPredicate