【发布时间】:2021-10-06 18:28:45
【问题描述】:
我正在开发一个应用程序,该应用程序使用 NSPersistentCloudKitContainer 在 iOS 15 中使用新的共享支持。我没有办法告诉 Core Data 一个对象或一组对象不再共享。
例如,如果我创建了一组对象,然后调用 share(_:to:completion:),则这些对象将正确共享并按预期移动到新的自定义 CKRecordZone。
现在,如果用户停止使用 UICloudSharingController 共享对象,Core Data 创建的 CKShare 会从 CloudKit 中正确删除,但对象仍在自定义区域中,Core Data 仍然具有原始的 @987654327 @ 与那些对象相关联。所以,当我打电话给fetchShares(matching:) 时,我仍然得到CKShare,但当然,这不再有效。过去,使用我自己的代码,我会使用UISharingControllers 委托来获得用户停止共享的通知,然后更新我的模型。但似乎没有办法告诉 Core Data 这一变化。
通过将应用程序移至后台然后再前台,或者通过停止应用程序并重新启动来强制 Core Data 获取 CloudKit 更改不会导致 Core Data 注意到对共享的更改。
有谁知道如何告诉 Core Data 这些对象不再共享?
【问题讨论】:
-
向 Apple 提交了反馈。希望我们将来能找到一些方法来做到这一点。与此同时,我不得不在我的应用程序中实现一些变通方法。我不喜欢它们,但它们工作得很好。
-
你是不是偶然使用了
CKModifyRecordsOperation? -
不,我仍然使用
UICloudSharingController来停止分享。但是要检查是否共享记录(以便我可以更新 UI),而不是依赖来自fetchShares(matching:)的CKShare的存在,我从该方法获取共享的 url,并调用CKContainer.shareMetadata(for: url)来验证共享实际上存在于 CloudKit 中。我将写更多关于我所做的事情,希望能帮助别人。当前的实现有很多“陷阱”。 -
我问是因为它从过时的文档中显示,以前可能是这样完成的? developer.apple.com/documentation/cloudkit/shared_records/…
-
是的,如果您想使用自己的代码手动删除共享,就是这样做的。但是,当用户选择“停止共享”时,
UICloudSharingController会为您执行此操作。