モデルカスタムクラスからコンテキストを非表示にするサンプルプロジェクトをコピーして貼り付けました:ブランチ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
マスターブランチには、モデルクラスがコンテキストを取得して操作する、より一般的なアプローチがあります。