我在删除CloudKit记录时遇到问题。这是我第一次处理API,显然有两种方法可以做到这一点。
保存记录是直截了当的,表面上是删除它们,除非不这样做:
func deleteRecords() {
let recordID = record.recordID
publicDatabase.delete(withRecordID: recordID) { (recordID, error) in
guard let recordID = recordID else {
print(error!.localizedDescription)
return
}
print("Record \(recordID) was successfully deleted")
}
}
我理解使用ckModifyRecordsOperation
是另一种方法,但这是批处理操作。我只需要一次删除一条记录。这是我的代码:
func batchDelete() {
let recordIDsToDelete = [CKRecordID]()
let operation = CKModifyRecordsOperation(recordsToSave: nil, recordIDsToDelete: recordIDsToDelete)
operation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
// handle errors here
}
publicDatabase.add(operation)
print("Batch \(recordIDsToDelete) record was successfully deleted")
}
这些单独或一起都不适用于我。
答案 0 :(得分:2)
你是对的,有两种方法。您描述的第一种方式被Apple称为"方便"功能。如果您只是删除单个记录,那么它可能是最快的选择。但是,每个便利操作都会自行访问数据库。如果您使用便捷功能循环浏览数千条记录并单独删除它们,那么您将使用大量的cloudKit配额进行一系列单独调用。
第二个选项,即操作,让您批量删除并在一次操作中发送它们。通常,这将更有效地使用您的cloudkit配额。但是,根据Apple的文档,两者之间没有技术差异;便利功能只是操作的包装。
现在,针对您的具体问题,该操作有两个单独的完成块:perRecordCompletionBlock
和modifyRecordsCompletionBlock
。正如名称所暗示的那样,第一个块在每个记录之后被调用,并且在操作中处理每个记录,并且表示出现错误。确保您实施perRecordCompletionBlock
并检查错误(然后您必须确定您的错误处理步骤是否属于perRecordCompletionBlock
或modifyRecordsCompletionBlock
)。
最后,如果操作(或便利功能)正在运行并且您确认完成阻止没有错误但是记录仍然没有删除,这通常表示您将nil而不是有效记录传递给删除