2

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

我知道使用 ackModifyRecordsOperation是另一种方法,但这是一个批处理操作。我一次只需要删除一条记录。这是我的代码:

 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")
}

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

4

1 回答 1

2

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

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

现在,针对您的具体问题,该操作有两个单独的完成块:perRecordCompletionBlockmodifyRecordsCompletionBlock. 顾名思义,在操作中处理完每条记录之后调用第一个块,这就是错误出现的地方。确保您perRecordCompletionBlock在那里实施并检查错误(然后您必须决定您的错误处理步骤是否属于perRecordCompletionBlockmodifyRecordsCompletionBlock)。

最后,如果操作(或便利功能)正在运行并且您确认完成块触发且没有错误但记录仍然没有删除,这通常表明您传递了 nil 而不是有效记录来删除。

于 2017-12-08T21:52:50.077 回答