CloudKitQueues
CloudKit记录的队列管理器,简化了个别和批量操作的实现。
无缝个别和批量操作
CloudKitQueues提供了对单个CKRecords和CKRecordIDs执行获取、保存和删除操作的方法。然后,这些操作被智能地批量组合,以获得最少CloudKit请求下最快的结果。
这可以在CloudKit请求限制下,以最小的请求数量获得最佳性能。
无需手动队列管理
使用CloudKitQueues,您不再需要管理循环中的批量CloudKit操作,也不需要管理批量操作的失败或重试。只需在单个CKRecords和CKRecordIDs上调用 fetch()
、save()
、delete()
,CloudKitQueues将确保它们以最高效的方式批量组合。
相同的方法既适用于单个独立操作,也适用于大型批量操作。CloudKitQueues将确保它们在所有情况下都得到最佳性能。
个别完成闭包
每个fetch、save和delete请求都可以传递一个可选的完成闭包,该闭包将在数据库操作完成后执行。这允许将数百个并发数据库操作一起批处理,同时能够单独对每个记录执行完成操作。
queue.fetch(ckRecordId) { ckRecord, error in
if let ckRecord = ckRecord {
print("ckRecord: " + ckRecord)
}
}
自动速率限制管理
CloudKitQueues会观察并尊重CloudKit的速率限制超时,并在超时允许后自动重试。
快速和慢速队列
CloudKitQueues管理两组队列
- 快速队列:用于快速操作,例如用户期待在UI中看到结果的操作。
- 慢速队列:用于慢速操作,例如用户不期待看到即时结果的备份、恢复和删除操作。
当获取记录时,您可以选择使用queue.fetch(ckRecordId)
或queue.slowFetch(ckRecordId)
。
当保存记录更改时,您可以选择使用queue.save(ckRecord)
或queue.slowSave(ckRecord)
。
当删除记录时,您可以选择使用queue.delete(ckRecordId)
或queue.slowDelete(ckRecordId)
。
CloudKitQueues内部管理这些队列,以便将“快速”操作批处理在一起并尽可能快地执行,而将“慢速”操作批处理在一起并在CloudKit确定能源和网络条件最合适时执行。
设置
pod 'CloudKitQueues'
或者直接将CloudKitQueue.swift
放入您的项目中。
示例
let publicQueue = CloudKitQueue(for: CKContainer.default().publicCloudDatabase)
let privateQueue = CloudKitQueue(for: CKContainer.default().privateCloudDatabase)
快速队列操作
请注意,所有的 save()
、fetch()
和 delete()
方法都接受可选的完成闭包。
// save the CKRecords for all cars
for car in cars {
publicQueue.save(car.ckRecord)
}
// fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars {
publicQueue.fetch(car.ckRecordId) { ckRecord, error in
car.ckRecord = ckRecord
}
}
// delete the remote CKRecords for all cars
for car in cars {
publicQueue.delete(car.ckRecordId)
}
慢队列操作
// slow save the CKRecords for all cars
for car in cars {
publicQueue.slowSave(car.ckRecord)
}
// slow fetch the CKRecords for all cars, and assign the fetched records
// to their car objects on fetch completion
for car in cars {
publicQueue.slowFetch(car.ckRecordId) { ckRecord, error in
car.ckRecord = ckRecord
}
}
// slow delete the remote CKRecords for all cars
for car in cars {
publicQueue.slowDelete(car.ckRecordId)
}