我编写了复制粘贴的示例项目,该项目从模型自定义类中隐藏了上下文:分支 10583736。
(这不是最终的生产代码,只是一个简单的例子,不要指望它会处理多线程或奇怪的错误)
将上下文隐藏到自定义类只是定义自定义方法以处理您通常会请求上下文并使用它的每种情况。
您可以在不暴露上下文的情况下为 store 层定义一个类:
@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
master分支有一种更常用的方法,模型类获取上下文并使用它。