删除 CloudKit 记录 Swift 4
Posted
技术标签:
【中文标题】删除 CloudKit 记录 Swift 4【英文标题】:Deleting CloudKit Records Swift 4 【发布时间】:2017-12-07 12:56:36 【问题描述】:我在删除 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")
这些单独或一起都不适合我。
【问题讨论】:
没有人知道“publicDatabase”是什么。public let publicDatabase = CKContainer.default().publicCloudDatabase
您没有提供任何有用的细节。运行此代码时实际发生了什么?在您的 deleteRecords
方法中,完成处理程序会发生什么?请注意,在您的 batchDelete
方法中,您不会尝试删除任何内容,因为您传递的是一个空数组。
我会给你一票否决的一再遗漏重要信息。
@maddy 什么都没有。我可以删除 tableView 中的行并刷新。我的refreshTable
再次查询数据库并重新加载表,但我删除的行再次出现。为什么不从数据库中删除记录是我要问的。
【参考方案1】:
你是对的,有两种方法。您描述的第一种方式被 Apple 称为“便利”功能。如果您只是删除一条记录,它可能是最快的实施方式。但是,每个便捷操作都会对数据库进行自己的访问。如果您遍历数千条记录并使用便捷功能单独删除它们,您将使用大量 cloudKit 配额进行一系列单独调用。
第二个选项,操作,让您批量删除并在一个操作中发送它们。通常,这将更有效地使用您的 cloudkit 配额。但是,根据 Apple 文档,两者之间没有技术差异。便利功能只是操作的包装。
现在,针对您的具体问题,该操作有两个单独的完成块:perRecordCompletionBlock
和 modifyRecordsCompletionBlock
。顾名思义,第一个块是在操作中处理完每条记录之后调用的,这就是出现错误的地方。确保实现perRecordCompletionBlock
并检查那里的错误(然后你必须决定你的错误处理步骤是属于perRecordCompletionBlock
还是modifyRecordsCompletionBlock
)。
最后,如果操作(或便利功能)正在运行,并且您确认完成块触发且没有错误但记录仍未删除,这通常表明您传递了 nil 而不是有效记录来删除。
【讨论】:
谢谢!我将实现这一点,看看会发生什么。我在文档中阅读了这个并且无法得到错误,因为(我认为)我没有实现perRecordCompletionBlock
:)以上是关于删除 CloudKit 记录 Swift 4的主要内容,如果未能解决你的问题,请参考以下文章
swift Swift - CloudKit - 获取添加保存删除多个记录
Swift cloudkit CKFetchRecordZoneChangesOptions 无法返回删除记录