CloudKit是苹果提供的云端数据存储服务,允许开发者在iCloud中存储和管理应用数据。它提供了结构化数据存储、文件存储和用户身份验证等功能。
首先确保你的应用已启用CloudKit功能,并在Xcode的Capabilities中配置好Container。
import CloudKit
func fetchAllRecords(from recordType: String, completion: @escaping ([CKRecord]?, Error?) -> Void) {
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
publicDatabase.perform(query, inZoneWith: nil) { (records, error) in
DispatchQueue.main.async {
if let error = error {
completion(nil, error)
return
}
completion(records, nil)
}
}
}
当记录数量很大时,需要使用CKQueryOperation
和游标(cursor)来分批次获取:
func fetchAllRecordsPaginated(from recordType: String, completion: @escaping ([CKRecord]?, Error?) -> Void) {
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
var allRecords = [CKRecord]()
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
let operation = CKQueryOperation(query: query)
operation.resultsLimit = 100 // 每批获取100条记录
operation.recordFetchedBlock = { record in
allRecords.append(record)
}
operation.queryCompletionBlock = { (cursor, error) in
if let error = error {
DispatchQueue.main.async {
completion(nil, error)
}
return
}
if let cursor = cursor {
// 还有更多记录,继续查询
let newOperation = CKQueryOperation(cursor: cursor)
newOperation.resultsLimit = operation.resultsLimit
newOperation.recordFetchedBlock = operation.recordFetchedBlock
newOperation.queryCompletionBlock = operation.queryCompletionBlock
publicDatabase.add(newOperation)
} else {
// 所有记录已获取完毕
DispatchQueue.main.async {
completion(allRecords, nil)
}
}
}
publicDatabase.add(operation)
}
原因:CloudKit对单次查询返回的记录数量有限制。
解决方案:
CKQueryOperation
并设置resultsLimit
原因:
解决方案:
原因:可能没有足够的权限访问指定的记录类型或数据库。
解决方案:
没有搜到相关的文章