当并非所有对象都将被存储时,使用 Core Data 作为模型

Posted

技术标签:

【中文标题】当并非所有对象都将被存储时,使用 Core Data 作为模型【英文标题】:Using Core Data as a model when not all objects will be stored 【发布时间】:2010-08-12 16:44:59 【问题描述】:

我正在开发一个从 Web 服务器下载数据的 iPhone 应用程序,我有时(但并非总是)想要缓存这些下载的结果。我正在处理的实体是一个事件。事件以下列方式出现在 UI 中:

作为基于位置的搜索的结果 作为基于关键字的搜索的结果 最喜欢的活动列表

只有在第三种情况下才有必要(或希望)将数据存储在本地数据库中。换句话说,我下载了一个事件,只有当用户决定将其添加到他们的收藏夹时,它才会存储在本地。

知道我正在下载的数据是 JSON 格式可能有帮助,也可能没有帮助。

我想使用一致的模型对象来表示事件,但有时它们会存储在数据库中,有时它们不会。我不希望我的视图控制器必须知道或关心对象来自哪里,它们应该能够显示来自本地缓存的事件,或者来自没有任何特殊代码的下载来处理任何一种情况。

因此,我可以使用 NSManagedObject(或其子类)来表示事件吗?如果我不这样做,在我看来,我将处理两个模型对象,一个是我的自定义对象,用于下载和未存储的事件,另一个是存储事件的 NSManagedObject 子类,两者都有相同的属性,但它们是根本不同的东西。

或者,是否有第三种选择,我创建某种装饰器对象(或协议?),它知道如何将来自视图控制器的请求代理到底层数据,有时是 NSManagedObject,有时是从生成的字典JSON?

这里推荐的解决方案是什么?

【问题讨论】:

【参考方案1】:

最简单的解决方案是通过NSManagedObject 上的-initWithEntity:insertIntoManagedObjectContext: 方法创建不带NSManagedObjectContextNSManagedObject 实例。

当您想要真正持久化对象时,您需要做的就是在实体上设置上下文并保存上下文。

【讨论】:

我没有意识到 initWithEntity 可以为对象上下文取 nil 值。很有趣。

以上是关于当并非所有对象都将被存储时,使用 Core Data 作为模型的主要内容,如果未能解决你的问题,请参考以下文章

CyclicBarrier

替换元素节点replaceChild()

iOS 9 中的新警告:“所有位码都将被丢弃”

信息收集 -- Drupal网站

具有内存存储的核心数据

spark RDD union 非常慢