[iOS13中使用NSPersistentCloudKitContainer的CloudKit同步

问题描述 投票:3回答:1

我正在为我的核心数据应用程序使用NSPersistentCloudKitContainer。在测试过程中,我检查了设备上所做的更改是否能在一秒钟内同步到CloudKit。

但是,当我在设备上禁用iCloud然后立即重新启用时,我在设备上的所有数据都消失了。我检查私有数据库中的数据是否仍存在于CloudKit上。将CloudKit上的数据同步回我的设备花了超过1天的时间。

这会在用户更换设备并首先看到他们的数据消失时给用户造成混乱。问题:如何控制CloudKit上的数据同步到我的设备的速度有多快?

core-data cloudkit ios13
1个回答
0
投票

令人沮丧的是,我认为这是'正常'的行为,特别是对于具有大量要同步的关系的大型数据库。

[NSPersistentCloudKitContainer似乎将每个关系视为一个单独的CKRecord,并且同步仍然受到相同的限制(例如,一次不超过400个“请求”),您经常会在其中看到这些.limitExceeded错误控制台,但几乎没有其他信息(例如,是否/何时重试?)。

我发现这导致数据库需要完全同步,与此同时,数据看起来混乱不完整。我有很多关系,数以千计,当用户从外部文件恢复数据库时,所有这些CKRecord都需要重新创建。

我在这里主要担心的是,无法查询NSPersistentCloudKitContainer是否有待处理的请求,尚未同步的请求数等等,因此您可以将其转发给用户界面中的用户,以便他们'不要一直删除并恢复认为它'失败'。

关闭同步时被删除的本地数据的一种解决方法-可能省去了重新打开时全部“重新同步”的可能-关闭时使用NSPersistentContainer,然后使用[ C0]开启时。

[NSPersistentCloudKitContainerNSPersistentCloudKitContainer的子类。

我目前正在我的自定义PersistenceService类的应用程序中执行此操作:

NSPersistentContainer

这至少会导致在您的应用程序中关闭iCloud时未更改本地数据,并且不需要在重新打开时重新同步所有内容(但您可能必须手动对更改的项目强制进行同步)。 

我想您还可以查询iOS,以查看用户是否已在系统设置中关闭了iCloud,并在static var useCloudSync = UserDefaults.standard.bool(forKey: "useCloudSync") static var persistentContainer: NSPersistentContainer = { let container: NSPersistentContainer? if useCloudSync { container = NSPersistentCloudKitContainer(name: "MyApp") } else { container = NSPersistentContainer(name: "MyApp") } container!.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container! }() 删除所有本地数据之前在这两个之间切换。

© www.soinside.com 2019 - 2024. All rights reserved.