我想从公共数据库中提取大约 500 条“访问”记录。CloudKit 一次只给你 100 条记录,所以我只使用下面的 CKQueryCursor 来获取我想要的所有记录。
func fetchVisits(_ cursor: CKQueryCursor? = nil) {
print("fetchVisits \(cursor)")
var operation: CKQueryOperation!
if let cursor = cursor {
operation = CKQueryOperation(cursor: cursor)
} else {
let query = CKQuery(recordType: "Visit", predicate: NSPredicate(format: "Client IN %@ AND ANY Students IN %@", visitClients, visitStudents))
operation = CKQueryOperation(query: query)
}
operation.recordFetchedBlock = {
(record) in
totalVisits.append(record)
}
operation.queryCompletionBlock = {
(cursor, error) in
if let error = error {
//handle error
} else if let cursor = cursor {
self.fetchVisits(cursor)
} else {
//all done!
}
}
CKContainer.default().publicCloudDatabase.add(operation)
}
我将函数称为:
fetchVisits()
效果很好,它可以获得我需要的所有访问。控制台日志
fetchVisits nil
fetchVisits Optional(<CKQueryCursor: 0x174228140; id=4bb7887c326fc719, zone=(null)>)
fetchVisits Optional(<CKQueryCursor: 0x17422a320; id=f67fb25669486da9, zone=(null)>)
fetchVisits Optional(<CKQueryCursor: 0x174228380; id=7e87eb8b7cfe1a74, zone=(null)>)
fetchVisits Optional(<CKQueryCursor: 0x17422cc80; id=e77e47ef2b29c8a4, zone=(null)>)
但问题是现在我想在按下按钮时刷新,现在它给了我这个错误:
“服务不可用”(6/2022);"请求失败,http 状态码 503"; 30.0 秒后重试
这很不言自明,我想我通过请求微不足道的 500 条记录来压倒服务器?所以我等待 30 秒并再次调用该函数,现在我得到了这个错误。
“超出限制”(27/2023);服务器消息 =“查询过滤器超出了值的限制:容器为 250
由于某种原因,我无法再次运行该功能。如果我重新启动应用程序,它会再次正常工作,但只是第一次。这个问题似乎特定于任何返回 CKQueryCursor 的表。我有其他我正在访问的表少于 100 条记录(因此光标为零),我可以多次提取这些表而不会出现任何问题。