用 CloudKit 驱动主从

Powering Master-Detail with CloudKit

我有一个 UISearchResultsController 可以在键入时在本地搜索,并在按下搜索按钮时进行远程搜索 (CloudKit)。返回的结果数需要在 10-30 个之间(我目前正在用 25 个来测试我的应用程序,它总是足够了)

搜索结果列表由 RecordType1 填充,而其详细信息由 RecordType1RecordType2 填充。我的问题是如何在最小化我的 requests/sec 的同时获取第二个引用类型。我正在查看 Apple 的 CloudCaptions 示例,他们通过在获取每个 RecordType1 时获取第二种记录类型来解决问题。这似乎不必要地创建了获取请求(1[RecordType1] + 25[RecordType2] = 26 个请求)。我怎样才能减少这个?似乎在两个请求中应该是可能的(一个用于 RecordType1,然后一个用于获取与之关联的所有 RecordType2)。

更新RecordType2 有对 RecordType1

的反向引用

除非我误解了你的问题,否则我认为你可以在你的 CloudKit 数据库上执行查询:

    let searchKey = ... // value for recordType1
    let z = CKRecordZone.default()
    let predicate = NSPredicate(format: "recordType1 == %@", searchKey)
    let query = CKQuery(recordType: "recordType2", predicate: predicate)
    db.perform(query, inZoneWith: z.zoneID) { (records, error) in
        if error != nil {
            // `records` contains recordType2
        } else {
            // check for errors
        }
    }

您还可以使用谓词中的 IN 比较来搜索多个键:

    let searchKeys = ... // [value1, value2, value3, etc.]
    let predicate = NSPredicate(format: "recordType1 IN %@", searchKeys)

参考资料

  1. CloudKit CKQueryOperation (Apple)
  2. CloudKit CKQuery (Apple)