Где разместить «основной стек данных» в приложении Cocoa / Cocoa Touch

Вы можете проверить для locationServicesEnabled и если служба определения местоположения разрешена для вашего приложения по этому коду:

if([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied) {
    //do your works
} else {
   //show an alert
}
67
задан Corey Floyd 12 August 2009 в 20:12
поделиться

6 ответов

[

]Резюме: Нет необходимости создавать одиночку для управления стеком Core Data; на самом деле, это может оказаться контрпродуктивным.[

] [

]Стек Core Data создается делегатом приложения. Важно, однако, что, как показывают все примеры, стек (в основном, контекст управляемого объекта) - это []а не [], извлекаемый непосредственно из стека(*). Вместо этого контекст передаётся на первый контроллер представления, а от них на контроллер представления или управляемый объект передаётся от одного контроллера представления к другому (как описано в []Accessing the Core Data Stack[]). Это следует основной схеме для всех приложений iPhone: данные или контроллер модели передаются от одного контроллера представления к другому.[

] [

]Типичная роль одиночной кнопки, описанная здесь, - это контроллер модели. В случае с Core Data контекст управляемого объекта уже является контроллером модели. Он также предоставляет возможность доступа к другим частям стека, если это необходимо. Более того, в некоторых ситуациях (как описано в документации) вы можете захотеть использовать другой контекст для выполнения дискретного набора действий. Поэтому подходящей единицей валюты для контроллера представления обычно является контекст управляемого объекта, в противном случае - управляемый объект. Использование и передача однокнопочного объекта, который управляет стеком (и из которого вы получаете контекст), обычно в лучшем случае вводит ненужный уровень идирекции, и в худшем случае вводит ненужную жесткость приложения.[

] [

](*) Ни один пример не извлекает контекст, используя:[

] [
[[UIApplication delegate] managedObjectContext];
]
39
ответ дан 24 November 2019 в 14:42
поделиться

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

28
ответ дан 24 November 2019 в 14:42
поделиться

Я оставляю логику основных данных в делегате приложения по следующим причинам:

1) Я не вижу никаких реальных преимуществ в переносе этого кода в другие классы: концепция делегирования полностью реализуется логикой основных данных, обрабатываемой делегатом приложения, поскольку основная модель данных на самом деле является фундаментальной частью вашего приложения. ;

2) Во всех примерах кода, которые я видел, включая образцы Apple, основные данные обрабатываются делегатом приложения;

3) Даже в книгах Core Data это обычная практика, когда делегат приложения обрабатывает код, связанный с основными данными;

4) Лично я не думаю, что удобочитаемость или что-то еще else на самом деле улучшается за счет наличия специальных классов для основных данных, но это вопрос личного вкуса, и я не буду здесь спорить, какой подход является лучшим. Для меня важна простота при сохранении функциональности.

11
ответ дан 24 November 2019 в 14:42
поделиться

В вашем случае я задаю себе вопрос: «Кто делает стек Core Data? 'принадлежит?" Сами данные действительно являются областью применения, не так ли? (CF Core Data на Mac, где у вас может быть приложение, способное работать с несколькими документами одновременно, поэтому стек Core Data принадлежит каждому документу.)

В любом приложении Cocoa / Cocoa Touch делегат приложения является обычно это предпочтительный способ настройки поведения приложения, так что это естественное место для стека Core Data.

Теперь я подозреваю, что у вас возникла проблема в том, что вам кажется неправильным постоянно писать такие вещи, как:

NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

В таких случаях я обычно пишу такие функции (не методы):

NSManagedObjectContext *UIAppManagedObjectContext() {
    return [*(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

Я пишу аналогичную функцию для NSPersistentStoreCoordinator и NSManagedObjectModel . Я помещаю все это в файлы .h / .m делегата приложения, так как они тоже являются объектами уровня приложения.

10
ответ дан 24 November 2019 в 14:42
поделиться

Я выступаю за то, чтобы делегат приложения знал, где начинается модель, и чтобы модель знала, где Контекст управляемого объекта есть. Основные данные - «сущность» модели мне кажется деталью реализации модели, классы контроллеров (например, делегат приложения) должны просто спросить: «Дайте мне эту информацию о модели», и модель должна знать, как ответить. этот вопрос.

4
ответ дан 24 November 2019 в 14:42
поделиться

Я просто перечислю это в новом ответе. (Я отказался от своего предыдущего класса FJSCoreDataStack в пользу этого)

Мой новый способ справиться с этим заключался в использовании категории в NSManagedObjectContext. Айв добавил следующие методы класса:

+ (NSManagedObjectContext *)defaultManagedObjectContext;
+ (NSManagedObjectContext *)scratchpadManagedObjectContext;
+ (NSManagedObjectModel *)managedObjectModel;
+ (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
+ (NSString *)applicationDocumentsDirectory;

Это позволяет исключить все из моего делегата приложения и дает доступ к одиночному элементу, если я решу его использовать. Однако я все еще использую внедрение зависимостей из делегата приложения (как сказал mmalc, он привносит негибкость в мой код). Я просто переместил весь код «Core Data Stack» в категорию NSManagedObjectCOntext.

Мне нравится передавать ссылку, тем более что у меня есть хороший метод «контекста блокнота». Это обеспечивает гибкость моих контроллеров представления, поскольку я не закреплял их в «defaultManagedObjectContext». NSFetchedResultsController and constructing NSFetchRequests

6
ответ дан 24 November 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: