Iphone 如何在类之间传输NSManagedObject子类?

Iphone 如何在类之间传输NSManagedObject子类?,iphone,objective-c,ios,core-data,Iphone,Objective C,Ios,Core Data,我们制作了一个存储库层,用于与核心数据进行交互,这些核心数据的方法包括allItems(),addItem:(Item*)Item,其中Item是NSManagedObject子类。当我们需要保存一个项目时,我们调用存储库上的方法,将子类实例作为参数传递。但是,这不起作用,因为我们不能使用init初始值设定项,并且上下文隐藏在存储库中 当您有这样的体系结构时,传输对象的最佳方式是什么?将一个项目传递给一个选项吗?或者有更好的方法来解决这个问题,比如根本不使用子类NSManagedObject,只

我们制作了一个存储库层,用于与核心数据进行交互,这些核心数据的方法包括
allItems()
addItem:(Item*)Item
,其中Item是NSManagedObject子类。当我们需要保存一个项目时,我们调用存储库上的方法,将子类实例作为参数传递。但是,这不起作用,因为我们不能使用
init
初始值设定项,并且上下文隐藏在存储库中


当您有这样的体系结构时,传输对象的最佳方式是什么?将一个项目传递给一个选项吗?或者有更好的方法来解决这个问题,比如根本不使用子类NSManagedObject,只使用有效的键/值。

通常,您希望创建
NSManagedObject
子类的控制器有一个指向
NSManagedObject上下文的指针。这样,您确实可以调用初始值设定项

您尝试执行的操作的问题是,如果没有上下文,这些项就无法存在。这样做是有目的的,以便核心数据知道您谈论的是新对象还是已经在持久存储中的对象

您可以使用DTO,但最终会导致大量重复,所以很快就会变得很糟糕。在我看来,你应该考虑让你的控制器知道核心数据上下文,以便它可以正确地检索或初始化项目(被管理的对象),并且基本上使用<代码> NSMARCADION ObjistValue<代码>作为你的知识库层。
请记住,
NSManagedObjectContext
是一个持久化抽象层,如果需要,您可以使用其他持久化存储实现(包括您自己的实现)对其进行备份。

我认为您使用的体系结构不适合核心数据。要继续使用它(你应该这样做),你必须做两件事中的一件。我假设您的“存储库层”是作为单例实现的,或者至少创建新托管对象的对象可以访问它

  • 将托管对象上下文公开给其他对象,通常作为存储库层上的属性
  • 让您的存储库层初始化并为您返回对象。这将涉及传入一个实体名称,并获取相应实体类型或类的新托管对象
如果你发现自己在与框架作斗争,并且提出了过多的抽象,那么你就错了

I wrotecopy粘贴了一个示例项目,该项目对模型自定义类隐藏了上下文:

(这不是最终的生产代码,只是一个简单的示例,不要指望它能处理多线程或奇怪的错误)

将上下文隐藏到自定义类只是定义自定义方法来处理通常会请求并使用上下文的每种情况

您可以为存储层定义一个类,而无需公开上下文:

@interface DataStore : NSObject

+ (id)shared;

- (void)saveAll;
- (NSEntityDescription *)entityNamed:(NSString *)name;
/* more custom methods ... */
- (NSManagedObject *)fetchEntity:(NSEntityDescription *)entity withPredicate:(NSPredicate *)predicate;

@end
我建议对所有自定义模型类使用一个共同的祖先,以节省一些输入。此类可以是唯一直接与
数据存储
交互的类。它没有访问上下文的权限

@interface DataObject : NSManagedObject

+ (NSString *)entityName;
+ (NSEntityDescription *)entity;
- (void)save;
/* more custom methods ... */

@end
最后,您的模型自定义类定义了您需要的任何方法,可能会利用超类提供的任何功能:

@interface Card : DataObject

@property (nonatomic, retain) NSString * question;
@property (nonatomic, retain) NSString * answer;
@property (nonatomic, retain) Deck *deck;

/* return a new card */
+ (Card *)card; 

/* more custom methods ... */

@end

主分支有一种更常用的方法,模型类可以获取上下文并使用它。

您能进一步解释一下您的问题吗?您的问题是不能在存储库层之外创建新的托管对象,还是以后不能保存对象?问题是上下文在存储库层内部“隐藏”,我不想在存储库层之外泄露。我想把它作为一个坚实的抽象点。你知道每个托管对象都有一个指向托管对象上下文的指针吗?那只猫有点出格了。是的,但是听着。我想在控制器中创建一个Item对象,然后将其传递到上下文所在的服务和存储库层。在JavaEE(JPA)中,对象不是附加到上下文的对象。