删除 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 文档,两者之间没有技术差异。便利功能只是操作的包装。

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

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

【讨论】:

谢谢!我将实现这一点,看看会发生什么。我在文档中阅读了这个并且无法得到错误,因为(我认为)我没有实现 perRecordCompletionBlock :)

以上是关于删除 CloudKit 记录 Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift - CloudKit - 获取添加保存删除多个记录

Swift cloudkit CKFetchRecordZoneChangesOptions 无法返回删除记录

如何在 Swift 中从 CloudKit 中删除资产?

swift Swift - CloudKit - 保存记录

swift Swift - CloudKit - 获取多个记录

swift Swift - CloudKit:保存单个记录