让我为您设置一个场景:我有一个包含 1000 条记录的 CloudKit DB。我需要取 150。
问题#1:默认情况下,CloudKit 返回 100 条记录和一个游标。如果我使用该游标来获取下一批,我最终将获取 200 条记录。即使这样也不能保证,这让我们,
问题#2:100条记录数不固定。 CloudKit 将根据 CloudKit 服务器的当前负载来决定返回多少条记录。因此,我可以在第一个查询中仅获取 30 条记录,在第二个查询中获取更多 30 条记录 = 60。
问题#3:如果我循环获取下一批,我最终会得到所有 1000 条记录。
这是我的循环代码,只是为了测试我设置了
resultsLimit: 75
。
func fetchRecords() async throws -> [CKRecord] {
let predicate = NSPredicate(value: true)
let query = CKQuery(recordType: "MyRecordType", predicate: predicate)
query.sortDescriptors = [NSSortDescriptor(key: "datePublished", ascending: false)]
var records: [CKRecord] = []
var (matchResults, queryCursor) = try await CKContainer(identifier: "iCloud.MyDB").publicCloudDatabase.records(matching: query, resultsLimit: 75)
records.append(contentsOf: matchResults
.compactMap { _, result in try? result.get()}
.compactMap { $0 })
while let cursor = queryCursor {
(matchResults, queryCursor) = try await CKContainer(identifier: "iCloud.MyDB").publicCloudDatabase.records(continuingMatchFrom: cursor, resultsLimit: 75)
records.append(contentsOf: matchResults
.compactMap { _, result in try? result.get()}
.compactMap { $0 })
}
print("Will return \(records.count) CloudKit records")
return records
}
此方法将返回所有 1000 条记录,按 75 / 查询获取它们。
有没有办法严格要求CloudKit交付150条记录(批量或不批量,但不超过150条),或者我应该低效地使用数据库并从CloudKit获取尽可能多的记录(例如200条),然后手动选择150条之后用 Swift 代码编写?
resultsLimit
是 CloudKit 将返回的最大行数。而不是将 75
硬编码为 resultsLimit
循环中的 while
。根据您还需要获得多少结果来调整该数字。一旦达到预期目标,就可以跳出while
循环。
假设有一个名为
maxRows
的变量,并将其设置为 150 或任何其他所需的行数。
while let cursor = queryCursor && records.count < maxRows {
let limit = maxRows - results.count
(matchResults, queryCursor) = try await CKContainer(identifier: "iCloud.MyDB").publicCloudDatabase.records(continuingMatchFrom: cursor, resultsLimit: limit)
records.append(contentsOf: matchResults
.compactMap { _, result in try? result.get()}
.compactMap { $0 })
}