Одноэлементный управляемый объектконтекст

Я хочу использовать singleton UIApplication для доступа к manageObjectContext AppDelegate. Но когда я пишу

[[[UIApplication sharedApplication] delegate] managedObjectContext]

or

[[[UIApplication sharedApplication] delegate] __managedObjectContext]

это не работает.

Но эта строка работает нормально:

NSLog(@"Seeking for the AppDelegate : %@", [[[UIApplication sharedApplication] delegate] class]);

У тебя есть решение ? Нильс


person Nielsou Hacken-Bergen    schedule 08.07.2011    source источник


Ответы (2)


Попробуйте привести его к фактической реализации делегата приложения, например

 [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

И добавить

#import "MyAppDelegate.h"

вверху файла.

person uvesten    schedule 08.07.2011
comment
Вы знаете, почему мы должны приводить, потому что, когда я тестировал класс, он был таким же, как приведение? - person Nielsou Hacken-Bergen; 08.07.2011
comment
Не из головы, нет. Удалось скомпилировать без приведения? Это должно быть то же самое, на самом деле. Странный. - person uvesten; 08.07.2011
comment
Вы можете использовать его без приведения, но в этом случае вы получите предупреждение. - person Mikhail Grebionkin; 08.07.2011

Использование синглтона, подобное этому, является плохой практикой и даже явно не рекомендуется в документации Core Data:

http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html

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

Когда вы создаете контроллер представления, вы передаете ему контекст. Вы передаете существующий контекст или (в ситуации, когда вы хотите, чтобы новый контроллер управлял дискретным набором правок) новый контекст, который вы для него создаете. Обычно ответственность за создание контекста для передачи первому отображаемому контроллеру представления лежит на делегате приложения.

Внедрение зависимостей (то есть предоставление контроллеру представления того, что ему нужно) лучше почти во всех ситуациях. На самом деле нехорошо видеть [[UIApplication sharedApplication] delegate] по всему коду приложения, потому что это затрудняет повторное использование кода, трудное написание тестов и т. д.

person Mike Weller    schedule 08.07.2011
comment
Да, это правда. Тем не менее, я только что ответил на вопрос плаката ;) Однако хорошо бы препятствовать этой практике. - person uvesten; 08.07.2011
comment
Спасибо за совет. Тогда я оставлю свой синглтон manageObjetContext. - person Nielsou Hacken-Bergen; 08.07.2011