用于本地存储和显示来自服务器的临时数据的核心数据 - 什么是最佳设计

时间:2012-06-13 03:51:17

标签: ios core-data storage

我还是Core Data的新手,请原谅这个问题。

我正在构建一个应用程序(简化)让人们“挑战”自己和他人。我需要在本地存储用户已经接受的挑战,以便他可以离线浏览他们的详细信息。然而,当应用程序在线时,我正在向服务器发出请求以显示可用的挑战,已经接受的挑战的新细节等等。因此需要进行一些同步,但我试图将其保持在最低限度。

现在我的问题是如何构建数据。我应该:

(1)仅针对存储在设备上的数据具有核心数据模型;然后只为从服务器解析的挑战构建模型类,并在我的表视图中显示一个Challenge对象数组?

(2)两者都有一个单一的核心数据模型,但不知何故区分了瞬态挑战本地的挑战?

(3)有两个持久存储,每个存储一个?

选项2和3显然具有使用NSFetchedResultsController的优势,但代码和维护可能更复杂。

而且,关于同步问题,我应该:

(4)保留上次更新每个本地挑战的时间戳,并将其与服务器上的时间戳匹配,以查看是否需要将新的详细信息推送到服务器?

(5)保存一系列密钥路径和更改,然后在互联网连接再次可用后将其推送到服务器。

解决这两个问题的最佳方法是什么。

非常感谢!

1 个答案:

答案 0 :(得分:1)

由于这是一个设计问题,而设计在某种意义上是一种艺术,总有不止一种方法,这就是我可能会做的。

我会创建一个模型来存储本地和可用的挑战,通过某些属性来区分它们。当没有网络连接时,我可能会选择过滤掉所有远程挑战,而不是显示缓存(或放置时的瞬态)挑战。当恢复连接或进行同步时,我会检查是否需要更新服务器上或本地的任何挑战。

时间戳是检查实体修改时间的好方法。如果您需要通过属性比较来进行冲突解决的属性,您可以使用crc32或md5哈希等校验和来加速二进制数据的比较。如果有的话。

即使有时间戳,也可能触摸了一个对象,但保存的值实际上保持不变,因此可以使用校验和来检测是否对对象进行了实际更改。您可以使用NSKeyedArchiver将对象序列化为NSData并计算其上的校验和。我发现这种方法可靠。