如何用resultsLimit严格限制CloudKit结果数量

问题描述 投票:0回答:1

让我为您设置一个场景:我有一个包含 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 代码编写?

swift cloudkit
1个回答
0
投票

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 })
}
© www.soinside.com 2019 - 2024. All rights reserved.