iOS - Core Data和服务器数据库同步的最佳实践

22

我正在为一个大型应用程序设置核心数据模型,并希望得到一些反馈,关于在服务器数据库和离线功能方面同步的正确方法/技术。

我使用PHP和MySQL作为我的Web服务器/数据库。

我已经知道如何连接、接收数据、存储到Core Data等等。我更希望帮助在以下情况下跟踪数据变化的方法论和特定实例:

A)确保应用程序和服务器在线和离线使用时同步(即离线活动将在回到在线状态后被推送上去)。 B)优化向应用程序保存数据的速度。

我的主要问题是:

检查哪些新/更新的应用程序数据仍需要同步的最佳方法是什么?

(即,在所有我的Core Data Entities中,我放置了一个BOOL类型的'isSynchronized'属性。然后在成功提交并从服务器发送响应后更新为“YES”。这是最好的方法吗?)

如何优化从服务器保存数据到Core Data的速度?

(即,如何只更新Core Data中早于服务器数据库上数据的数据,而不是每次迭代每个实体并更新每个实体?是否可能不在每个表格中添加服务器数据库列来跟踪更新时间戳?)

同样,我已经知道如何下载数据并将其存储到Core Data中,我只是想寻求一些帮助来确保在确保优化处理时间的同时跨应用程序和服务器数据库进行同步的最佳实践。


请参见https://dev59.com/UXRC5IYBdhLWcg3wFdFx客户端-服务器同步模式算法的内容。 - danh
1个回答

9
我在手机的核心数据记录和服务器上的MySQL表中存储了最后修改的时间戳。
手机会搜索自上次同步以来所有已更改的内容,并将它们发送到服务器,同时附带上一次同步的时间戳。服务器将返回自提供的同步时间戳以来自身端发生的所有更改。
当有大量记录发生更改时,性能是一个问题。我使用后台NSOperation进行同步,其具有自己的托管对象上下文。当后台线程完成对其托管对象上下文的更改后,有一个API可以将所有更改合并到主线程的托管对象上下文中,如果用户在同步期间更改数据导致冲突,则可以配置为仅放弃所有更改。在这种情况下,我只需要等待几秒钟,然后再尝试进行同步。
在旧硬件上,即使进行了多次优化,如果用户开始在应用程序中进行操作,则完全中止同步仍然是必要的,因为它会消耗过多的系统资源。我认为现代iOS设备可能已经足够快,不再需要这样做了。(顺便说一句,当我说“有很多记录已更改”时,我的意思是手机上更新或插入约30,000行)

同样的,我在每个实体中使用修改日期来存储上次成功服务器调用的时间。在每个API调用中,我将其传递给服务器,服务器有触发器,在任何时候更改时设置每个表中的类似列。我使用三个上下文模型来异步处理更新,就像这个问题中所述。 - enjayem
我还使用最后同步的数据和表记录的日期时间戳来管理同步。 - Durai Amuthan.H
1
你如何确保手机时间戳和服务器时间戳完全一致?例如,如果手机时间戳比服务器早10秒,并且在这段时间内发生了更改,则数据将丢失。 - Zoon Nooz
@ZoonNooz 如果某人的时钟设置不正确,那么它会出现问题,当他们抱怨数据丢失时,我们的技术支持团队会告诉他们启用自动日期/时间同步,这应该意味着它们准确到分秒内。我们还在服务器上保留了详尽的日志,因此如果数据丢失,可以手动恢复(按每小时100美元的计费率...)。我还将服务器设置为假定5分钟时间延迟,在手机上的任何比服务器早不到5分钟的内容都被认为是新于服务器的数据。 - Abhi Beckert
@ZoonNooz 如果我能再做一次,我也会让手机在每个请求中发送其时钟上的当前日期/时间。如果时间差超过几分钟,我会以错误消息的形式失败,并告诉用户修复他们的时钟。您可能不希望在需要上传大量数据的任何请求中进行此检查(例如照片/等可能需要几分钟才能上传)。 - Abhi Beckert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接