如何从 NSPersistentCloudKitContainer 获取 CKRecord 的新副本?

Posted

技术标签:

【中文标题】如何从 NSPersistentCloudKitContainer 获取 CKRecord 的新副本?【英文标题】:How to get a fresh copy of CKRecord from NSPersistentCloudKitContainer? 【发布时间】:2020-02-16 02:26:08 【问题描述】:

根据此处的 Apple 文档

https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/reading_cloudkit_records_for_core_data

您可以使用 NSPersistentCloudKitContainer 从 NSManagedObject 获取 CKRecord。

访问 CloudKit 对象 您可以通过其关联的上下文直接访问托管对象的 CKRecord,使用 record(for:) 访问单个记录,或使用 records(for:) 访问多个记录。要仅检索记录 ID,请使用 recordID(for:) 或 recordIDs(for:)。 或者,在 NSPersistentCloudKitContainer 上使用类函数 record(for:)、records(for:)、recordID(for:) 和 recordIDs(for:)。

但它没有说明如何获得新副本?如果您正在使用 CloudKit 共享,那么您正在修改 CK 而无需通过 CoreData。在这种情况下,您必须等待 NSPersistentCloudKitContainer 下一次获取更新。

但是如果要呈现最新的分享状态,则需要查询Cloudkit。如何做到这一点?

【问题讨论】:

【参考方案1】:

使用带有 RecordID 的 fetch(如下)可以让您获取最新记录:

func fetch(withRecordID recordID: CKRecord.ID, 
completionHandler: @escaping (CKRecord?, Error?) -> Void)

如果您想获取它然后更新属性并保存,您可以执行以下操作:

从 cloudkit 中获取记录

CKContainer.default().publicCloudDatabase.fetch(withRecordID: user.id!)  updatedRecord, error in

然后为我要保存的键和键类型设置新数组(其中用户数组是我更新的东西,'keyType' 是 CK 记录字段名称)

updatedRecord!.setObject(arrayForUser as __CKRecordObjCValue?, forKey: keyType)

然后进行保存调用,传递更新的记录:

        CKContainer.default().publicCloudDatabase.save(updatedRecord!)  savedRecord, error in

【讨论】:

以上是关于如何从 NSPersistentCloudKitContainer 获取 CKRecord 的新副本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?