如何在 NSPersistentCloudKitContainer 同步之前向 CKRecord 添加父级?

Posted

技术标签:

【中文标题】如何在 NSPersistentCloudKitContainer 同步之前向 CKRecord 添加父级?【英文标题】:How to add a parent to CKRecord before NSPersistentCloudKitContainer will sync it? 【发布时间】:2020-07-20 17:19:50 【问题描述】:

NSPersistentCloudKitContainer 会自动为 NSManagedObjects 创建所有 CKRecords,所以...

如何在同步更改之前访问此进程并设置 CKRecord.parent。

我需要 B 类型的每个 CKRecord 都有 A 类型的父记录,但要避免完全手动处理 setParent(:) 作为完全独立的机制。

【问题讨论】:

【参考方案1】:

保存到Core Data后,可以通过NSPersistentCloudKitContainer提供的函数读取here获取CKRecord。

例如,您可以使用 CKModifyRecordsOperation 将 parent 设置为记录并将其保存到数据库,是的,您必须使用 CloudKit 操作才能工作。

【讨论】:

我已经创建了这样的机制,它似乎过于复杂。原因如下: 1. 我创建 NSManagedObject(还没有对象的 CKRecord) 2. 保存上下文(CKRecord 仅在互联网可用时才出现!,否则没有 CKRecord。3. 即使互联网可用,镜像已经在当前上下文中开始同步保存 4. 我的 CKModifyRecordsOperation 在这里启动 如果互联网可用,这种方法的失败率约为 5%。如果不是,我已经创建了代码,它使用“hasRemoteParent”属性(我已经创建)获取所有对象并处理它们。我在 NWMonitor 处理程序中启动它。镜像也在做同样的事情,如果我在互联网恢复时获取上下文,CloudKit 镜像就会中断,我再也看不到互联网了。这只是一场噩梦,我无法战胜镜像失败并从头开始完全创建同步(无论如何我必须为 sharedCloudDatabase 这样做。 嗯,是的,这很复杂,但如果没有可用的互联网,您可以在应用程序运行之前监听网络变化,一旦互联网可用,您就可以同步到共享数据库。 正如我在上面的评论中所说,我已经这样做了。我用 NWPathMonitor 收听互联网(我弄错了,输入了 NWMonitor)。当我在互联网恢复时进行上下文提取时,镜像就会死掉(不知道为什么)。我可以使用 CloudKit 进行任何操作,但 Apple 的镜像永远不会同步,因为这会失败,直到重新启动应用程序,并说“可能没有互联网”。所以,你提出的一切都已经完成,可以工作,但是会导致镜像失败的愚蠢错误。无论如何感谢您的宝贵时间,我很高兴知道有什么新想法,但我已经尝试了所有我认为的方法。 这真的很奇怪,我不知道为什么会这样。我从未在我的应用程序中遇到过这种情况..

以上是关于如何在 NSPersistentCloudKitContainer 同步之前向 CKRecord 添加父级?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?