Почему стек CoreData в шаблоне с поддержкой CoreData XCode рассматривается как закрытый? - PullRequest
1 голос
/ 07 мая 2010

Что касается шаблонов XCode с включенным CoreData, я прочитал неясное использование @property в оконном приложении с использованием основных данных , которое идет над «что» в шаблонах. Но у меня возникла проблема с «почему». Объявляя категорию в файле реализации, средства доступа CoreData действуют как частные методы. Проблема в том, что когда вы хотите использовать CoreData в другом месте вашего приложения, вам нужен дополнительный код.

Я подумал, что вам нужно либо предоставить свой собственный метод, который предоставляет контекст управляемого объекта, например ...

- (NSManagedObjectContext *)getManagedObjectContext
{
    return self.managedObjectContext;
}

... что позволит другим частям вашего приложения использовать его.

В противном случае вам нужно будет упаковать делегат приложения специальными методами для возврата управляемых объектов, например, getProducts или setUser.

Кто-нибудь может пролить свет на рассуждения здесь?

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

Причина этого в том, что вы должны использовать внедрение зависимостей в своих проектах.Это рекомендуемый дизайн командой Core Data.Ожидается, что ваш делегат приложения установит ссылку NSManagedObjectContext в ваших корневых контроллерах.Оттуда контроллеры будут устанавливать или вводить необходимые зависимости в следующих контроллерах представления.

Это приведет к более гибкой конструкции.Я подробно обсудил это в своей статье о MDN (http://www.mac -developer-network.com / article / cd0004.html ).

1 голос
/ 07 мая 2010

Если ваш проект большой и нуждается в доступе к контексту управляемого объекта извне AppDelegate, Я бы просто переместил объявление свойства managedObjectContext в файл заголовка, как в:

@interface myAppDelegate : NSObject <UIApplicationDelegate> {
    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;       
    NSPersistentStoreCoordinator *persistentStoreCoordinator;
}
@property (retain,nonatomic) NSManagedObjectContext*managedObjectContext;
@end

Тогда другие части приложения могут просто использовать appDelegate.managedObjectContext. Однако нет никаких причин выставлять managedObjectModel или persistentStoreCoordinator вне делегата приложения.

Кстати, у меня есть несколько комментариев о вашем использовании Objective-C:

Не используйте get перед геттером. Для свойства с именем foo получатель должен быть

-(Foo*)foo;

и сеттер должен быть

-(void)setFoo:(Foo*)_foo;

По соглашению get... используется, когда указатель подается в качестве аргумента метода, как в -[NSString getCharacters:range:] (см. Apple doc ).

Следуйте пословице, когда в Риме, делайте, как делают римляне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...