Luc*_*uke 5 iphone core-data objective-c ios
我们已经创建了一个存储库层,用于与Core Data进行交互allItems(),addItem:(Item*)item其中包含的方法是,其中item是NSManagedObject的子类.当我们需要保存项时,我们在存储库上调用方法,将子类实例作为参数传递.但是,这不起作用,因为我们无法使用init初始化程序,并且上下文隐藏在存储库中.
当你拥有这样的架构时,传输对象的最佳方法是什么?让一个ItemDTO绕过一个选项吗?或者有更好的方法来解决这个问题,例如根本不使用子类NSManagedObject,只使用有效的键/值.
我说你使用的架构不适合核心数据.要继续使用它(你应该),你必须做两件事之一.我假设您的"存储库层"实现为单例,或者至少创建新托管对象的对象可以访问它.
如果你发现自己正在与框架作斗争并提出过多的抽象,那么你做错了.
我编写了一个复制粘贴的示例项目,该项目隐藏了模型自定义类的上下文:分支 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
最后,您的模型自定义类定义了您需要的任何方法,可能会利用超类提供的任何方法:
@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
主分支有一种更常见的方法,其中模型类获取上下文并使用它。
| 归档时间: | 
 | 
| 查看次数: | 351 次 | 
| 最近记录: |