我们已经创建了一个存储库层,用于与Core Data进行交互,该存储库层具有诸如allItems()addItem:(Item*)item之类的方法,其中item是NSManagedObject子类。当需要保存项目时,我们在存储库上调用方法,并将子类实例作为参数传递。但是,这不起作用,因为我们不能使用init初始化程序,并且上下文隐藏在存储库中。

当您拥有这样的体系结构时,传输对象的最佳方法是什么?是否使ItemDTO传递选项?还是有更好的方法来解决此问题,例如根本不使用子类化的NSManagedObject,而仅使用有效的键/值。

最佳答案

我编写并粘贴了一个示例项目,该示例项目从模型自定义类branch 10583736隐藏了上下文。

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

将上下文隐藏到自定义类中只是定义自定义方法以处理通常情况下将请求该上下文并使用它的每种情况的问题。

您可以为商店层定义一个类,而无需暴露上下文:

@interface DataStore : NSObject

+ (id)shared;

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

@end

我建议对所有自定义模型类使用一个共同的祖先,以节省一些输入。此类可以是唯一与DataStore直接交互的类。它无权访问上下文。
@interface DataObject : NSManagedObject

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

@end

最后,您的模型自定义类定义了可能需要利用父类(super class)提供的任何方法的任何方法:
@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

master分支具有一种更常用的方法,其中,模型类获取上下文并使用该上下文。

关于iphone - 如何在类之间传输NSManagedObject子类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10583736/

10-09 15:35
查看更多