Singleton managedObjectContext - PullRequest
3 голосов
/ 08 июля 2011

Я хочу использовать одноэлементное приложение UIA для доступа к managedObjectContext из AppDelegate.Но когда я пишу

[[[UIApplication sharedApplication] delegate] managedObjectContext]

или

[[[UIApplication sharedApplication] delegate] __managedObjectContext]

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 08 июля 2011

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

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

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

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

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

7 голосов
/ 08 июля 2011

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

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

И добавить

#import "MyAppDelegate.h"

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

...