我开始构建一个iOS应用程序,它将利用核心数据并通过iCloud将其数据与其他设备同步。我正在考虑提供一个“同步”按钮,以便不随时通过iCloud的数据修改数据。然后会出现以下情况: -
用户A正在使用设备A并添加两条记录。用户B当前正在使用设备B并且不按下同步按钮。晚上,用户B决定更新设备B中的数据并按下同步按钮(我对这种情况有以下问题): -
mergeChangesFromContextDidSaveNotification
可以在按下同步按钮后插入这两个记录吗? (我认为可以。但是,只需要在继续使用此模型之前确认)答案 0 :(得分:3)
我不认为iCloud是专为您的用例而设计的。 iCloud为同一用户的设备同步数据,即在多个设备中使用相同Apple ID登录的数据。这个想法是,当用户在不同的设备上打开应用程序时,他可以继续使用他之前在其他设备上创建/修改的数据。
更新中存在相当多的延迟,因此即使您通过“同步”按钮启用/禁用同步,也无法保证实际的交付时间,并且在某些情况下可能需要很长时间,具体取决于连接速度,机会, Apple服务器等的状态
相反,您可以根据自己的服务器和数据方案设计自定义解决方案。
答案 1 :(得分:0)
由于你正在使用iCloud和核心数据 - 不,你不能做这样的事情。当iCloud同步Core Data更改时,它会在后台执行此操作。它会下载更改,将它们保存到数据存储中,然后完成后它会告诉您已经发生的更改。调用mergeChangesFromContextDidSaveNotification
不会保存更改 - 它们已经保存。该调用的作用是使用持久性存储中的新数据更新托管对象上下文。在新的插入已经发生之后,您会收到通知。把“导入”通知想象成是另一个线程的“保存”通知,告诉你已经完成的事情。
现在,如果您在收到导入通知时已经加载了托管对象,则可以将其当前属性与最新的传入更改更新中的属性进行比较。如果您还没有内存中的对象,则无法获取其旧值,因为它们已被覆盖。