我有一个iCloud鞋盒应用程序的问题,希望有人可以帮助我(我花了很多时间徒劳地对抗它).
应用程序: - 一个简单的库样式应用程序 - 包含一组类别(Cat1 .. CatN),每个类别包含项目(Item1 ... ItemM).我使用Apple的iPhoneCoreDataRecipes来设置iCloud CoreData堆栈.
一切都与iCloud完美配合,除了 - 用户可以在第一次打开应用程序后开始使用一些预先填充的空类别(他当时也可以离线).这是魔鬼.
这是我的工作 - 一旦我的persistentStoreCoordinator设置我发送通知
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName: @"RefetchAllDatabaseData"
object: self
userInfo: nil];
});
Run Code Online (Sandbox Code Playgroud)
这是我的MasterViewController收到的.收到通知后,MasterViewController会检查存储中的类别数.如果可用类别的数量等于0 - 则插入预填充类别.
仅供参考 - 我使用NSMergeByPropertyObjectTrumpMergePolicy作为我的ManagedObjectContext
问题:这适用于第一台设备.但对于第二个设备,iCloud的默认类别通常比设置的persistentStoreCoordinator(以及第二个设备插入的默认类别)晚收到.最后,我在两个设备上都有两组具有相同名称的类别.
有什么想法可以解决这个问题吗?
尝试过的解决方案:我试过两种策略来解决这个问题.两者都以同样的方式开始.我打电话后
[moc mergeChangesFromContextDidSaveNotification: note];
Run Code Online (Sandbox Code Playgroud)
我打电话
[self materializeKeysWithUserInfo: note.userInfo forContext: moc];
Run Code Online (Sandbox Code Playgroud)
非常感谢来自https://devforums.apple.com/thread/126670?start=400&tstart=0的 Jose Ines Cantu Arrambide 的参考代码 - 实质上
materializeKeysWithUserInfo:forContext:
Run Code Online (Sandbox Code Playgroud)
从note.userInfo获取managedObjectIds,并从ManagedObjectContext中检索相应的对象,将它们放入字典中.
策略1:
这些策略甚至在它们出现在UI BUT之前就有效地消除了两个设备上的重复项
1)来自第一个设备的物品在第二个设备上丢失 - 当他们来到第二个设备时,他们的父类别不存在,他们的类别字段等于零,所以我不知道放在哪里.
2)在短时间内,由于冲突,第二台设备上丢失的物品也会在第一台设备上丢失.
3)源于第二设备的一些项目也因冲突而丢失.
我试图更喜欢较新的类别而不是更新,但它没有产生任何影响 …