Objective c 数据控制器是否应返回NSManagedObjects或NSObjects

Objective c 数据控制器是否应返回NSManagedObjects或NSObjects,objective-c,core-data,architecture,nsmanagedobject,Objective C,Core Data,Architecture,Nsmanagedobject,我的应用程序中有几个数据控制器。每个数据控制器负责管理数据的特定部分。他们可以访问核心数据,处理NSManagedObjects,并通过使用NSMainQueueConcurrencyType或NSPrivateQueueConcurrencyType为NSManagedObjectContexts排队,确保所有操作都是线程安全的,具体取决于调用者使用数据控制器的线程 它的架构只有数据控制器知道核心数据的内容,比如上下文、托管对象、获取请求等 这意味着数据控制器不应返回NSManagedObje

我的应用程序中有几个数据控制器。每个数据控制器负责管理数据的特定部分。他们可以访问核心数据,处理
NSManagedObject
s,并通过使用
NSMainQueueConcurrencyType
NSPrivateQueueConcurrencyType
NSManagedObjectContext
s排队,确保所有操作都是线程安全的,具体取决于调用者使用数据控制器的线程

它的架构只有数据控制器知道核心数据的内容,比如上下文、托管对象、获取请求等

这意味着数据控制器不应返回
NSManagedObject
s。首先要确保它们只能由正确的上下文访问,而正确的上下文仅在数据控制器本身中可用,其次要强制实施只有数据控制器才能处理与CoreData相关的任何内容的体系结构

但是数据控制器应该返回什么呢?创建
NSManagedObject
NSObject
副本,复制所有属性并返回该副本,这是一个好主意吗?这是有道理的,但在我看来,这不是理想的解决办法,甚至没有必要


有更好的方法吗?

我认为你的问题已经给出了正确的答案:

它的架构只有数据控制器知道核心数据的内容,比如上下文、托管对象、获取请求等

您应该通过向程序的其余部分提供
nsmanagedobject
来避免破坏核心数据独立设计。独立于第三方框架(尤其是持久性框架)是一种良好且高度可测试的设计。因此,请使用
NSObject

还要记住,持久性框架可能会在程序的生命周期内发生变化。商业模式恰恰相反


评论更新

要将
NSManagedObject
转换为
NSObject
,反之亦然,您必须编写自己的封送拆收器/转换器类。有很多教程介绍如何将
NSManagedObject
s转换为
NSDictionary
包括关系


如果真的需要吹毛求疵,你也必须自己动手。但是,作为一般的性能优化,这应该是您列表中的最后一个主题,并且只有在生产中遇到性能问题时才会出现在您的列表中。

您是对的,但是,考虑到
NSManagedObject
属性可能会附加一个完整的子结构,甚至一些有故障的属性,有没有一种简单而省钱的方法来从
NSManagedObject
创建一个
NSObject