【发布时间】:2015-04-14 10:56:08
【问题描述】:
我有一个使用 Core Data 和 iCloud 同步的 Swift 1.2 应用程序。
在第一个屏幕中,用户可以插入一些数据来创建自定义的 MyNSManagedObjects。
每个 MyNSManagedObject 都必须有一个它所属的特定“组”。 这个“类别”在我的数据模型中由另一个自定义 NSManagedObject 表示,我们称之为 MyManagedObjectsCategory。
用户可以创建许多 MyManagedObjectsCategory 对象,但应用还需要一个 MyManagedObjectsCategory 类型的 DEFAULT 对象,以防用户不创建任何不同的 MyManagedObjectsCategory。
每个 MyNSManagedObjects 只能有 1 个 MyManagedObjectsCategory,但一个 MyManagedObjectsCategory 可以有多个 MyNSManagedObjects。
当用户启动应用程序时,我会立即检查 DEFAULT MyManagedObjectsCategory 是否已经存在,如果不存在,我会创建一个 DEFAULT MyManagedObjectsCategory 对象并将其保存到持久存储中。当然,只有在应用程序第一次启动时我需要创建这个对象,之后我总是会获取我在应用程序第一次启动时创建的对象并使用它。
我的问题是在我启用 iCloud 同步时开始的;现在,在应用程序首次启动时,会发生这种情况:
应用启动时按预期使用 STORAGE 1(本地),但未找到 MyManagedObjectsCategory 类型的 DEFAULT 对象,它创建了一个新对象。
如果有网络覆盖,几秒钟后应用程序切换到 STORAGE 0(云)并保存刚刚创建的 DEFAULT MyManagedObjectsCategory 对象;如果设备离线,这不会立即发生,但当然会在稍后网络连接可用时发生。
当我在不同的设备上第一次启动应用程序时,上面的第 1 点和第 2 点再次发生:由于应用程序从存储 1 开始,它不会获取 DEFAULT MyManagedObjectsCategory 对象它会创建并保存一个新的,几秒钟后或当网络可用时,当应用切换存储时,它会同步到存储 0。
您可以想象,当不同的设备同步时,我发现自己有多个 DEFAULT 对象,而且由于我是 Core Data 的新手,我不知道如何处理这个问题。
一方面,我需要在应用启动时立即使用 DEFAULT 对象,所以我迫不及待地切换到存储 0(另外,因为我不知道用户是否有网络连接,所以存储切换可能会在很久以后发生);另一方面,DEFAULT 对象的目的是在每个设备上都是一个,并且始终相同。
我了解,即使每个 DEFAULT 对象都具有以完全相同的方式创建的匹配属性(对象具有名称和 myID 字符串属性),Core Data 也会为每个托管对象创建一个唯一 ID,并且由于 ID在不同时刻在不同设备上创建的 DEFAULT 对象之间不匹配,它不会将它们合并到单个 DEFAULT 对象中。
所以,我的问题:
如果某些属性完全相同,是否有办法强制将 DEFAULT 对象合并为一个对象?是这样,怎么做?我想我可以在应用启动时这样做,因为只有在将新设备添加到 iCloud 时才会发生 DEFAULT 对象的复制。
是否有完全不同的方法来处理我所遗漏的这个问题?
我在过去的 2 个月里一直在开发这个应用程序,但是我无法在同步时发送重复对象的东西,而且我不知道如何修复它,所以任何帮助都非常非常感谢。
谢谢, @cdf1982
【问题讨论】:
-
将 CodeData 与 ICloud 一起使用时,很难避免数据不同步。在我的公司,我们以这种方式制作了一款应用程序,我向您保证,我们永远不会再这样做了。系统的不透明性使得修复不同步数据变得非常困难。苹果对这个特定问题的支持一直非常……沉默。我对你的建议:不要将 CoreData 与 iCloud 一起使用,而且最重要的是不要相信那些告诉你它会产生奇迹的人,因为它不会。
标签: swift core-data sync icloud nsmanagedobject