I schrieb kopiert ein Beispielprojekt, das den Kontext aus benutzerdefinierten Modellklassen versteckt: branch 10583736.
(es ist nicht Endfertigung Code, nur ein kurzes Beispiel, nicht erwarten, es mit Multithreading oder seltsame Fehler umgehen) ist
Ausblenden der Kontext zu benutzerdefinierten Klassen nur eine Frage der Methoden individuelle Definition von zu gehe mit jeder Situation um, in der du normalerweise den Kontext anfordern und verwenden wirst.
Sie können eine Klasse für die Schichtspeicher definieren ohne den Kontext aussetzt:
@interface DataStore : NSObject
+ (id)shared;
- (void)saveAll;
- (NSEntityDescription *)entityNamed:(NSString *)name;
/* more custom methods ... */
- (NSManagedObject *)fetchEntity:(NSEntityDescription *)entity withPredicate:(NSPredicate *)predicate;
@end
Ich schlage vor, einen gemeinsamen Vorfahren für alle Ihre benutzerdefinierten Modellklassen zu verwenden, um einige Tipparbeit zu sparen. Diese Klasse kann die einzige sein, die direkt mit DataStore
interagiert. Es hat keinen Zugriff auf den Kontext.
@interface DataObject : NSManagedObject
+ (NSString *)entityName;
+ (NSEntityDescription *)entity;
- (void)save;
/* more custom methods ... */
@end
Schließlich definiert Ihr Modell benutzerdefinierte Klassen jede Methode, die Sie wahrscheinlich Vorteil der Einnahme müssen, was von der übergeordneten Klasse zur Verfügung gestellt:
@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
Der Master Zweig eine übliche Vorgehensweise hat die Klassen, in denen Modell erhalten Kontext und arbeiten damit.
Können Sie Ihr Problem etwas weiter erklären? Tritt das Problem auf, dass Sie neue verwaltete Objekte nicht außerhalb der Repository-Schicht erstellen können oder dass Sie die Objekte später nicht speichern können? – jrturton
Das Problem ist, dass der Kontext innerhalb der Repository-Schicht "versteckt" ist und ich möchte das nicht außerhalb der Repository-Schicht leaken. Ich möchte das als einen soliden Punkt der Abstraktion verwenden. – LuckyLuke
Sie wissen, dass jedes verwaltete Objekt einen Zeiger auf den Kontext des verwalteten Objekts hat? So ist diese bestimmte Katze aus der Tasche, irgendwie. – jrturton