2014-01-31 4 views
0

В каждом методе в каждом классе моего приложения IOS, за исключением AppDelegate, у меня есть следующие строки кода:Есть ли лучший способ определить определения NSManagedObjectContext для MagicalRecord?

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 

В моем файле AppDelegate.h я это:

NSManagedObjectContext *localContext; 

и в моем файле AppDelegate.m у меня есть это:

localContext = [NSManagedObjectContext MR_contextForCurrentThread]; 

Я недавно прочитал в SO, что я должен иметь один такой строки кода в AppDelegate, а затем несколько refere nce к нему из всех других классов/методов.

Если я оставлю эту строку кода из всех классов, за исключением AppDelegate, выполним ли это, но это лучший способ для этого?

UPDATE Это код, который я добавил к моему AppDelegate.h файла:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (strong, nonatomic) NSManagedObjectContext *localContext; 

Это код, который я добавил к моему AppDelegate.m файла:

// set default MagicalRecord context in all View Controllers 
UITabBarController *tbc = (UITabBarController *)self.window.rootViewController; 

UINavigationController *nc = tbc.viewControllers[0]; 
CalendarViewController *cvController = (CalendarViewController *)nc.topViewController; 
cvController.localContext = self.managedObjectContext; 

nc = tbc.viewControllers[1]; 
WeeksApptsViewController *waController = (WeeksApptsViewController *)nc.topViewController; 
waController.localContext = self.managedObjectContext; 

nc = tbc.viewControllers[2]; 
CustomerSetupController *csController = (CustomerSetupController *)nc.topViewController; 
csController.localContext = self.managedObjectContext; 

nc = tbc.viewControllers[3]; 
AppointmentsViewController *avController = (AppointmentsViewController *)nc.topViewController; 
avController.localContext = self.managedObjectContext; 

nc = tbc.viewControllers[5]; 
SettingsViewController *sController = (SettingsViewController *)nc.topViewController; 
sController.localContext = self.managedObjectContext; 

Когда я запустите приложение в отладчике, он сработает в этой строке кода:

CalendarViewController *cvController = (CalendarViewController *)nc.topViewController; 

со следующим сообщением:

* Нагрузочного приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: '- [CalendarViewController viewControllers]: непризнанный селектор направил к экземпляру 0xb67ed40'

+0

Вы должны проверить фактический класс всех контроллеров представления. Начните с 'tbc = self.window.rootViewController'. Это действительно UITabBarController? Затем проверьте 'nc = tbc.viewControllers [0]' это действительно UINavigationController? И так далее ... - Я предполагаю, что CalendarViewController на первой вкладке не встроен в контроллер навигации. В этом случае 'CalendarViewController * cvController = tbc.viewControllers [0];' должен работать. –

ответ

1

Если вашему все приложение использует только один контекст управляемого объекта, , и вы уверены, что это будет никогда изменение в будущем, , тогда вы действительно можете использовать

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_defaultContext]; 

на все виды контроллеров.

Но с введением вложенных управляемых контекстов объектов, компании Apple рекомендует в Core Data Release Notes for OS X v10.7 and iOS 5.0:

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

В простейшем случае вы получаете указатель на контекст по умолчанию в AppDelegate:

defaultContext = [NSManagedObjectContext MR_defaultContext]; 

и передать этот контекст из AppDelegate первого контроллера представления, и оттуда к следующему (например, в prepareForSegue при использовании раскадровки), и так далее.

Это облегчает переход, если вы решите позже изменить структуру, , например. в нескольких контексте, как описано здесь: http://www.cocoanetics.com/2012/07/multi-context-coredata/

Отметим также, что в соответствии с этим ответом https://stackoverflow.com/a/20536335/1187415, MR_contextForCurrentThread устарела.

+0

Привет, Мартин ... не использует Segues для навигации в моем приложении iPad ... с помощью UITabBarController. Поэтому я предполагаю, что тогда мой вопрос: как бы вы передали контекст каждому из классов (включая контроллеры), кроме как ссылку на определенный контекст в AppDelegate, который работает, но не уверен, что это лучший способ сделать это? – SpokaneDude

+0

@ spokane-dude: в каждом контроллере представления задайте «@property (сильный, неатомный) контекст NSManagedObjectContext *; - в вашем приложении AppDelegate в' doneFinishLaunchingWithOptions' вы задаете свойство контекста контроллеров представлений. - Сравнить http://stackoverflow.com/a/18568793/1187415. –

+0

Большое спасибо ... этого достаточно, чтобы меня начали ... – SpokaneDude

Смежные вопросы