删除CloudKit记录Swift 4

时间:2017-12-07 12:56:37

标签: ios swift cloudkit cloudkit-environments ckmodifyrecordsoperation

我在删除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")
}

这些单独或一起都不适用于我。

1 个答案:

答案 0 :(得分:2)

你是对的,有两种方法。您描述的第一种方式被Apple称为"方便"功能。如果您只是删除单个记录,那么它可能是最快的选择。但是,每个便利操作都会自行访问数据库。如果您使用便捷功能循环浏览数千条记录并单独删除它们,那么您将使用大量的cloudKit配额进行一系列单独调用。

第二个选项,即操作,让您批量删除并在一次操作中发送它们。通常,这将更有效地使用您的cloudkit配额。但是,根据Apple的文档,两者之间没有技术差异;便利功能只是操作的包装。

现在,针对您的具体问题,该操作有两个单独的完成块:perRecordCompletionBlockmodifyRecordsCompletionBlock。正如名称所暗示的那样,第一个块在每个记录之后被调用,并且在操作中处理每个记录,并且表示出现错误。确保您实施perRecordCompletionBlock并检查错误(然后您必须确定您的错误处理步骤是否属于perRecordCompletionBlockmodifyRecordsCompletionBlock)。

最后,如果操作(或便利功能)正在运行并且您确认完成阻止没有错误但是记录仍然没有删除,这通常表示您将nil而不是有效记录传递给删除