如何使用 CloudKit 和 Swift 保存 1000 条记录而不超过 30 或 40 requests/second
How do I implement saving 1000s of records using CloudKit and Swift without exceeding 30 or 40 requests/second
让我描述一下我试图实现的基本流程:
- 用户登录
- 系统使用对第 3 方的 HTTP 请求检索用户的连接列表 API(可能是 1000 多个)。我将此列表称为 userConnections
- 系统从我的应用程序的数据库中检索存储的连接(可能在 100,000 中)。我将此列表称为 connections
系统然后检查每个 userConnection 是否已经存在于 connections 列表中,如果不存在,则保存它到数据库:
for userConnection in userConnections {
if connections.contains(userConnection) {
//do nothing
} else {
saveRecord(userConnection)
}
}
问题在于,当第一批用户登录时,应用程序将尝试在一秒钟内调用 1000 次保存记录,CloudKit 服务器不允许。
我如何使用 CloudKit 和 Swift 以不同的方式实现它,以便将它保持在可接受的 requests/second 数量,比如 ~30 或 40?
对于任何想知道的人,这就是我最终这样做的方式。 TroyT 的评论是正确的,您可以批量保存您的记录。此答案包括排队批次的奖励:
let save1 = CKModifyRecordsOperation(recordsToSave: list1, recordIDsToDelete: nil)
let save2 = CKModifyRecordsOperation(recordsToSave: list2, recordIDsToDelete: nil)
save1.database = publicDB
save2.database = publicDB
save2.addDependency(save1)
let queue = NSOperationQueue()
queue.addOperations([save1, save2], waitUntilFinished: false)
save1.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
if (error != nil){
//handle error
}else{
//data saved
}
}
让我描述一下我试图实现的基本流程:
- 用户登录
- 系统使用对第 3 方的 HTTP 请求检索用户的连接列表 API(可能是 1000 多个)。我将此列表称为 userConnections
- 系统从我的应用程序的数据库中检索存储的连接(可能在 100,000 中)。我将此列表称为 connections
系统然后检查每个 userConnection 是否已经存在于 connections 列表中,如果不存在,则保存它到数据库:
for userConnection in userConnections { if connections.contains(userConnection) { //do nothing } else { saveRecord(userConnection) } }
问题在于,当第一批用户登录时,应用程序将尝试在一秒钟内调用 1000 次保存记录,CloudKit 服务器不允许。
我如何使用 CloudKit 和 Swift 以不同的方式实现它,以便将它保持在可接受的 requests/second 数量,比如 ~30 或 40?
对于任何想知道的人,这就是我最终这样做的方式。 TroyT 的评论是正确的,您可以批量保存您的记录。此答案包括排队批次的奖励:
let save1 = CKModifyRecordsOperation(recordsToSave: list1, recordIDsToDelete: nil)
let save2 = CKModifyRecordsOperation(recordsToSave: list2, recordIDsToDelete: nil)
save1.database = publicDB
save2.database = publicDB
save2.addDependency(save1)
let queue = NSOperationQueue()
queue.addOperations([save1, save2], waitUntilFinished: false)
save1.modifyRecordsCompletionBlock = { savedRecords, deletedRecordsIDs, error in
if (error != nil){
//handle error
}else{
//data saved
}
}