使用 CloudKit 和 Swift 一次保存多个 CKRecords
Save Multiple CKRecords At One Time Using CloudKit and Swift
是否可以使用 Swift 在一次 CloudKit
操作中保存多个 CKRecord
对象?我知道如何使用 CKFetchRecordsOperation
甚至常规 performQuery
之类的东西一次检索多个记录。我刚刚意识到我不确定在一次操作中保存多个新记录的方法。到目前为止,我一直这样做的方式对我来说似乎效率低下。例如:
let recordsToSave:[CKRecord]!
for newRecord in recordsToSave {
if let database = self.publicDatabase {
database.saveRecord(newRecord, completionHandler: { (record:CKRecord?, error:NSError?) in
// Check if there was an error
if error != nil {
// There was an error, handle it properly.
}
else {
// There wasn't an error
if let savedRecord = record {
// Handle saved record accordingly.
}
}
})
}
虽然这确实工作得很好而且花花公子,但在我看来它似乎效率极低。我认为调用一个特定的函数来保存 CKRecords
的整个数组会更有意义,而不是每次通过循环都必须进行数据库调用。基本上这就是我希望我能做到的:
let recordsToSave:[CKRecord]!
if let database = self.publicDatabase {
// SOMETHING HERE LIKE database.saveRECORDS (plural) ????
database.saveRecords(recordsToSave, completionHandler: { (records:[CKRecord]?, error:NSError?) in
// Check if there was an error
if error != nil {
// There was an error, handle it properly.
}
else {
// There wasn't an error
if let savedRecords = records {
}
}
})
}
据我所知,并根据我获得的信息。没有像 database.saveRecords
(复数)这样的实际函数。除非我遗漏了什么?我认为它不是那么干脆,而且命名不同,但我认为必须有类似的东西。
每次循环都必须进行数据库调用,这似乎非常低效。
有人知道使用 CloudKit
一次保存多个 CKRecords
的方法吗?任何帮助都将不胜感激。提前致谢!
在循环中使用 saveRecord
是非常低效的。实际上最好避免使用 CKDatabase
上的所有便捷方法并使用适当的操作。
要add/modify/delete 一条或多条记录,请使用CKModifyRecordsOperation
。您可以 add/modify 以及通过一次操作删除任意数量的记录。这将比使用 saveRecord
.
高效得多
我建议您浏览 CloudKit Framework Reference 以查看可用操作的完整列表。
根据 rmaddy 所说的内容,这里有一个示例代码,如果您在“删除”参数(我这里为 nil)中添加一个 CKRecords 数组,它也适用于删除。这就是我的意思:
let db = CKContainer.default().publicCloudDatabase
let operation = CKModifyRecordsOperation.init(recordsToSave: recordsToSave, recordIDsToDelete: nil)
operation.modifyRecordsCompletionBlock = { _, _, error in
if let error = error{
print(error.localizedDescription)
let alert = UIAlertController(title: "Operation Failed", message: "There was a problem interacting with some records.", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
}
}
db.add(operation)
是否可以使用 Swift 在一次 CloudKit
操作中保存多个 CKRecord
对象?我知道如何使用 CKFetchRecordsOperation
甚至常规 performQuery
之类的东西一次检索多个记录。我刚刚意识到我不确定在一次操作中保存多个新记录的方法。到目前为止,我一直这样做的方式对我来说似乎效率低下。例如:
let recordsToSave:[CKRecord]!
for newRecord in recordsToSave {
if let database = self.publicDatabase {
database.saveRecord(newRecord, completionHandler: { (record:CKRecord?, error:NSError?) in
// Check if there was an error
if error != nil {
// There was an error, handle it properly.
}
else {
// There wasn't an error
if let savedRecord = record {
// Handle saved record accordingly.
}
}
})
}
虽然这确实工作得很好而且花花公子,但在我看来它似乎效率极低。我认为调用一个特定的函数来保存 CKRecords
的整个数组会更有意义,而不是每次通过循环都必须进行数据库调用。基本上这就是我希望我能做到的:
let recordsToSave:[CKRecord]!
if let database = self.publicDatabase {
// SOMETHING HERE LIKE database.saveRECORDS (plural) ????
database.saveRecords(recordsToSave, completionHandler: { (records:[CKRecord]?, error:NSError?) in
// Check if there was an error
if error != nil {
// There was an error, handle it properly.
}
else {
// There wasn't an error
if let savedRecords = records {
}
}
})
}
据我所知,并根据我获得的信息。没有像 database.saveRecords
(复数)这样的实际函数。除非我遗漏了什么?我认为它不是那么干脆,而且命名不同,但我认为必须有类似的东西。
每次循环都必须进行数据库调用,这似乎非常低效。
有人知道使用 CloudKit
一次保存多个 CKRecords
的方法吗?任何帮助都将不胜感激。提前致谢!
在循环中使用 saveRecord
是非常低效的。实际上最好避免使用 CKDatabase
上的所有便捷方法并使用适当的操作。
要add/modify/delete 一条或多条记录,请使用CKModifyRecordsOperation
。您可以 add/modify 以及通过一次操作删除任意数量的记录。这将比使用 saveRecord
.
我建议您浏览 CloudKit Framework Reference 以查看可用操作的完整列表。
根据 rmaddy 所说的内容,这里有一个示例代码,如果您在“删除”参数(我这里为 nil)中添加一个 CKRecords 数组,它也适用于删除。这就是我的意思:
let db = CKContainer.default().publicCloudDatabase
let operation = CKModifyRecordsOperation.init(recordsToSave: recordsToSave, recordIDsToDelete: nil)
operation.modifyRecordsCompletionBlock = { _, _, error in
if let error = error{
print(error.localizedDescription)
let alert = UIAlertController(title: "Operation Failed", message: "There was a problem interacting with some records.", preferredStyle: .alert)
let ok = UIAlertAction(title: "Ok", style: .cancel, handler: nil)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
}
}
db.add(operation)