Fro*_*ner 5 cloudkit swiftui nspersistentcloudkitcontainer
我使用 NSPersistentCloudKitContainer 将对象保存在 CoreData + CloudKit 中。我集成了一个共享功能,可将对象移动到单独的区域以使用 UICloudSharingController 进行共享,如中所述https://developer.apple.com/wwdc21/10015
当用户停止共享时,我希望删除共享区域中的对象,并将其移回CoreData + CloudKit标准私有区域。使用以下方法删除 CKShare 及其区域:
/**
Delete the Core Data objects and the records in the CloudKit record zone associcated with the share.
*/
func purgeObjectsAndRecords(with share: CKShare, in persistentStore: NSPersistentStore? = nil) {
guard let store = (persistentStore ?? share.persistentStore) else {
print("\(#function): Failed to find the persistent store for share. \(share))")
return
}
persistentContainer.purgeObjectsAndRecordsInZone(with: share.recordID.zoneID, in: store) { (zoneID, error) in
if let error = error {
print("\(#function): Failed to purge objects and records: \(error)")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在删除之前如何将 CKShare 深度复制回私有区域?
我不确定我是否理解正确,但我会尝试回答:
假设私有数据库中的记录层次结构或区域应由所有者共享。
当共享启动时,邀请用户共享数据,并且CKShare
在所有者的私人数据库中初始化记录。
当用户接受邀请时,CKShare
用户可以通过用户的共享数据库访问记录和共享数据。它们不会被复制到共享数据库;共享数据库只是所有者私有数据库的一个窗口。但是,如果共享数据库由 CoreData + CloudKit 镜像到共享用户的持久存储,NSManagedObjects
则为共享数据创建。
当所有者或用户停止共享时,NSManagedObjects
用户通常无法再访问这些内容。原则上,这也是由 iCloud 镜像处理的:共享数据库不再是所有者数据的窗口,即它不再包含记录CKShare
和共享数据,因此镜像会将它们从用户的持久存储中删除。但这可能需要很长时间。要更快地删除共享数据的本地副本,可以调用persistentContainer.purgeObjectsAndRecordsInZone
.
现在回答我不明白的问题:“深复制回CKShare
私有区域”是什么意思?所有者的私有数据库从未被修改(除了更新记录中的用户状态CKShare
或 - 当最后一个用户停止共享时 - 删除记录CKShare
)。所以不需要把CKShare
记录拷回来。用户的私有数据库都没有被修改。
对我来说,“深层复制”回私有数据库的唯一情况是共享用户即使在共享停止后也希望保留共享数据。如果您想这样做,您必须在所有共享对象可用时立即复制它们,即一旦它们从 iCloud 共享数据库镜像到本地持久存储时。您可以使用.NSPersistentStoreRemoteChange
通知来进行复制。purgeObjectsAndRecordsInZone
那么只会删除原件,而不删除副本。
编辑:
让我们举个例子:
一个用户(此处称为“所有者”)在 CoreData 持久存储中拥有一些所有者记录,该存储镜像到 iCloud 到所有者的私有数据库。在设置过程中,iOS 会在所有者的私有数据库中创建一个新区域“com.apple.coredata.cloudkit.zone”。
首先假设没有共享记录。
然后,iOS 将更新登录到同一 iCloud 帐户的所有设备的持久存储:
本地更改将导出到所有者私有数据库中的此区域,而 iCloud 更改将导入到所有者的持久存储中。
现在假设所有者邀请另一个用户(此处称为“参与者”)来共享所有者的记录层次结构或所有者的区域。
然后,CKShare
在所有者的私人数据库中创建一条记录,指定共享详细信息,即由谁共享什么。
拥有相同应用程序的参与者在参与者的持久存储中拥有一些参与者的记录,这些记录镜像到参与者的私有数据库。在设置过程中,iOS 会在参与者的私有数据库中创建一个新区域“com.apple.coredata.cloudkit.zone”。
当参与者接受所有者的共享数据邀请时,iOS 会将所有者的共享数据映射到参与者的共享数据库。“映射”意味着所有者私有数据库中 com.apple.coredata.cloudkit.zone 区域中的所有者数据现在出现在新区域“com.apple.coredata.cloudkit.zone”中的参与者共享数据库中。与共享数据一起,CKShare
所有者私有数据库的记录也映射到参与者的共享数据库。
该区域现在由 iOS 镜像到参与者的持久存储中。
对于所有者来说,除了CKShare
记录之外,什么都没有改变。
当所有者或参与者停止共享时,所有者的数据在所有者的私有数据库中的映射终止,即所有者的共享数据不再出现在参与者的共享数据库中。
由于它们是为参与者(而不是所有者)删除的,因此这会镜像到参与者的持久存储,并且共享记录会在参与者的持久存储中删除。然而,这需要一段时间。为了立即删除共享数据,可以persistentContainer.purgeObjectsAndRecordsInZone
在共享终止时使用。
我希望这能澄清情况!
归档时间: |
|
查看次数: |
858 次 |
最近记录: |