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