0

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

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

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

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

(2) 两者都有一个单一的核心数据模型,但以某种方式区分本地的挑战和暂时的挑战?

(3) 有两个持久存储,一个用于每个目的?

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

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

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

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

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

非常感谢!

4

1 回答 1

1

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

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

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

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

于 2012-06-14T07:32:22.213 回答