【发布时间】:2011-07-04 18:02:28
【问题描述】:
我有一个连接到网站的应用程序。我将其数据存储为核心数据,然后使用核心数据加载我的表格视图。我相信,每次启动应用程序时,我都想从网站重新加载数据,因为如果用户要进入网站,他们可以更改数据。
解决这个问题的最佳方法是什么?每次应用终止时我应该只删除核心数据吗?
【问题讨论】:
我有一个连接到网站的应用程序。我将其数据存储为核心数据,然后使用核心数据加载我的表格视图。我相信,每次启动应用程序时,我都想从网站重新加载数据,因为如果用户要进入网站,他们可以更改数据。
解决这个问题的最佳方法是什么?每次应用终止时我应该只删除核心数据吗?
【问题讨论】:
这取决于设备上的数据始终保持最新的重要性、您希望用户在使用该应用之前等待多长时间以及如果有人在网络连接时尝试使用该应用您希望发生什么速度慢或不可用。如果您删除了商店,并且应用程序无法立即连接,则用户没有数据。即使网络很好,用户仍然需要等待网络和服务器延迟才能开始使用应用程序。这可能是糟糕的用户体验。
另一方面,如果您允许数据在应用退出后保留,用户的数据可能不是最新的,至少一开始不是。
如果您不希望数据在应用退出后保留,内存存储可能是最佳选择,因为它永远不会保存到文件中。
如果(a)在应用程序启动时短暂显示或(b)在网络不可用时显示可能的旧数据是可以的,更好的选择是保留数据存储但进行新的网络调用以更新现有数据.您可以提供某种 UI 来指示更新正在进行中。您可能还会在应用内显示您的应用上次与服务器同步的时间。
【讨论】:
我不确定您的应用程序如何使用 Core Data 堆栈,但如果您不关心(或没有)在设备本地进行的更改,我会说最简单的方法从服务器刷新数据就是你所说的:清除存储文件,重新创建它并从服务器导入数据。但是,我不会在每次应用程序启动时系统地执行此操作。确保用户知道它并考虑提供一个“刷新”按钮来触发该过程。还要确保您可以在清除本地存储之前从服务器下载新内容。
【讨论】:
如果您想将所有数据加载到内存中(并且还想进行更新),那么您可以创建一个由NSAtomicStore 持久存储子类支持的托管对象上下文。在 NSAtomicStore 子类中,您可以实现读取:(load: 方法)和 CRUD 操作(newReferenceObjectForManagedObject:、save: 和 updateCacheNode:fromManagedObject: 方法)
【讨论】: