如何为 NSManagedObject 子类编写自定义访问器?

Posted

技术标签:

【中文标题】如何为 NSManagedObject 子类编写自定义访问器?【英文标题】:How to write custom accessors for an NSManagedObject subclass? 【发布时间】:2012-05-10 02:20:01 【问题描述】:

我有一个名为Cart 的视图。它显示Items 的表格。这些Items需要持久化,所以Item子类NSManagedObject; idprice 等值是访问器为 @dynamic 的属性,因此它们是自动生成的。

我有另一个名为Favorites 的视图。它显示Items 的表格,但它们不需要持久化。事实上,只要用户使用不同的凭据登录,此视图就会发生变化。

这两个视图之间的联系是用户可以从他的收藏夹中将项目添加到他的购物车。购物车可以存储来自不同Favorites 列表的Items。 Favorites 将商品添加到购物车时列表不会更改。

最初,我将 Favorites 视图的模型设为 NSDictionary 对象的 NSArray。当用户将商品添加到他的购物车时,我从 NSDictionary 键值对创建并保存在 Core Data 中的商品。这种方法看起来不是很干净或很干燥。让Favorites 视图的模型成为Items 的NSArray 不是更有意义吗?

所以现在我的意图是实现Item 类,以便它代表核心数据模型(NSManagedObject),但也可以使用Favorites 视图。作为 Objective-C 和 ios 开发的新手,我真的不知道这将如何工作或看起来如何。似乎我需要覆盖为我神奇地创建的访问器,但我不能在编译时使用 super 调用来调用它们......谁能给我一个粗略的轮廓它什么时候会知道返回NSDictionary 数据还是核心数据数据?如果它是 Core Data 数据,我如何保持与神奇生成的访问器相同的效率水平?

更好的是,是否有更好的实现方式与 DRY 一样或更有意义?还是我试图将太多的功能组合到一个类中?在这种情况下,NSDictionary 对象的 NSArray 是最好的方法吗?

【问题讨论】:

【参考方案1】:

您可以在获取请求中指定结果类型(对象、objectID、计数、字典)。

另外,我不会在 MOC 之外使用 NSManagedObjects。您应该有一个单独的对象用于内存内容,或者您​​可以为这些对象使用内存中的持久存储...或者,您可以创建一个单独的 MOC 作为您使用的主数据库 MOC 的子对象用于内存中的对象。

这些方法的优点是您的代码不必知道它们是否已备份到磁盘。

只要不保存 MOC,对这些对象的更改就永远不会写入磁盘。

编辑

NSFetchRequest *fetchRequest = // create the fetch request...
fetchRequest.resultType = NSDictionaryResultType;

现在,当您进行提取时,您将返回一个 NSDictionary 数组,而不是返回一个 NSManagedObject 数组。

【讨论】:

你介意你的第一句话的意思更具体一点吗?我还在习惯 Objective-C 和 iOS,那么那些不同的函数原型会是什么样子呢?谢谢! @JodyHagins +1 为您解答

以上是关于如何为 NSManagedObject 子类编写自定义访问器?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 子类的自定义初始化

如何在 Swift 中为 iOS 10 和 iOS 9.3 初始化 NSManagedObject 子类

如何在Swift中初始化iOS 10和iOS 9.3的NSManagedObject子类

如何为使用数据模型创建的核心数据类添加属性?

如何为 UIView 的自定义子类设置约束?

如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?