I 已寫入複製粘貼了隱藏模型自定義類的上下文的示例項目: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
最後模型的自定義類定義,你可能需要利用無論是通過超提供的任何方法:
@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
的主分支下有個更常用的方法,即模型類獲得上下文並使用它。
你能解釋一下你的問題嗎?您的問題是您無法在存儲庫層之外創建新的託管對象,或者您以後無法保存對象? – jrturton
問題是上下文在存儲庫層中是「隱藏」的,我不想泄露存儲庫層以外的內容。我想用它作爲抽象的堅實點。 – LuckyLuke
您知道每個託管對象都有一個指向託管對象上下文的指針嗎?所以那個特別的貓就是這樣的。 – jrturton