使用现有(普通)模型将核心数据添加到iPhone应用程序

时间:2011-08-09 20:22:05

标签: iphone objective-c ios core-data architecture

我有一个相当复杂的iPhone应用程序,它依赖于API从服务器获取数据并将其显示给用户。我有大约5个模型类在整个应用程序中使用 - 它们只是扩展NSObject。

我想为模型添加一些持久性,即使设备处于脱机状态,也允许使用应用程序的某些部分 - 它实际上基本上只是美化缓存。我只希望保留某些模型实例 - 例如,用户已添加书签的项目 - 其他项目不应该,例如数百个搜索结果。

Core Data是否适合此解决方案?我能看到的困难是:

  • 我必须改变整个项目中实例化模型对象的方式。我必须将它们初始化为上下文的一部分,如果它们实际上来自外部API,则不一定有意义。
  • 我需要注意不要坚持我不想要的实例。这似乎归结为在创建后立即删除托管对象(非常笨拙)或者为不希望持久存在的实例使用单独的非持久上下文(更好,但仍然有些尴尬)

我希望我可以在整个应用程序中继续使用我的模型,而无需更改不需要关注持久性的代码,但鉴于我的要求,这似乎不可行。另一种方法是与我现有的对象并行设置一组新的托管对象,并且只使用托管对象来保持持久性 - 但这种复制似乎永远不是正确的解决方案。

我是否应该尝试将核心数据窃听到这个,如果是这样,怎么样?或者我应该只看其他选项 - sqlite3(对于我需要的东西看起来有点复杂),用户默认值(可能不是他们想要的),甚至是序列化并将我自己的对象写入文件(似乎hack-ish )。

感谢您的任何意见!

2 个答案:

答案 0 :(得分:3)

为什么不看看NSKeyedArciver / Unarchiver?我会说Core Data是处理大量数据和sqlite数据库时的明显解决方案,但NSKeyedArchiver是我用来保存模型的。 查看Apple的文档here。使用NSKeyedArchiver是非常简单的IMO,你可以用它存储你需要的任何东西。

答案 1 :(得分:1)

现在,您将数据对象实例化为NSObject的子类。您可以使用另一级别的间接来选择是否将对象创建为ManagedObjectModel的子类,并使用定义用于从这些对象访问信息的接口的协议保持大部分应用不变,然后传递类型为{的对象{1}}。无法获取将指示非本地对象。

或者,您可以将所有内容创建为托管对象,而不是存储除了您不想在本地存储的数据的密钥之外的任何内容。因此,您可以知道是否存在任何对象以及如何在需要时获取它但您不会花费大量时间或空间来保留应保留在云中的数据。这样做的方法是将模型中的所有键定义为可选项。

我会选择Core Data,因为它具有灵活性,实用性和优化性。这真的值得学习。我不推荐使用sqlite3方法,iOS上的前进方式是Core Data。如果您使用某种文件存储,您应该考虑如何批量读取和/或写入,因为您可能会遇到一些执行多个小文件操作的性能问题。