我正在努力应对核心数据概念,我需要做一些澄清。
我正在使用Storyboard,我有2个视图。第一个视图嵌入在导航控制器中,第二个视图只是一个来自模态segue的UIViewController。 在AppDelegate中,我使用以下代码将managedObjectContext传递给第一个视图:
UINavigationController *nav = (UINavigationController *) self.window.rootViewController;
JobListTableViewController *jltvc = (JobListTableViewController *)[[nav viewControllers]objectAtIndex:0];
jltvc.managedObjectContext = self.managedObjectContext;
现在的问题是,我现在还需要将adminObjectContext从AppDelegate传递到我的第二个视图,但我不知道如何抓住它。 这样做,只是失败,因为没有索引1:
AddJobsViewController *ajvc = (AddJobsViewController *)[[nav viewControllers]objectAtIndex:1];
我无法发布我的故事板的截图,因为我没有足够的stackoverflow声誉:(
对此核心数据/委派问题的任何帮助都将受到高度赞赏。 谢谢。
答案 0 :(得分:6)
在 JobListTableViewController 或 AddJobsViewController 中,您可以像这样持有 AppDelegate 的引用。
#import "AppDelegate.h"
AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
jltvc.managedObjectContext = app.managedObjectContext;
答案 1 :(得分:0)
我建议您不要从视图控制器传递上下文。而不是创建新的上下文并从新上下文中获取实体。传递相同上下文的缺点是,如果在两个不同的位置修改了同一个实体,则必须管理合并冲突。上下文就像一个废料垫,可用于进行更改和保存,或者如果您不想更改,则可以放弃上下文。因此,每次要修改实体时都可以创建本地上下文,并根据需要保存或丢弃实体,从而避免冲突。 我更喜欢的是像这样的3层系统
-(NSManagedObjectContext*) backgroundMasterContext // this context is used to save data in core data
{
if(!_backgroundMasterContext) {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if(coordinator) {
_backgroundMasterContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_backgroundMasterContext setPersistentStoreCoordinator:coordinator];
}
}
return _backgroundMasterContext;
}
-(NSManagedObjectContext*) mainContext // this context is a read only context which is used everytime you want to read the entities
{
if (!_mainContext) {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator) {
_mainContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_mainContext setParentContext:self.backgroundMasterContext];
}
}
return _mainContext;
}
-(NSManagedObjectContext*) createWriteContext // this context is used everytime you want to edit an entity
{
NSManagedObjectContext *newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[newContext setParentContext:self.mainContext];
return newContext;
}
为了保存,我打电话给这个方法
- (void) saveAllWithContext:(NSManagedObjectContext*) writeContext
success:(DMSuccessBlock)success
failure:(DMFailureBlock)failure
{
BOOL b = NO;
NSError *error = nil;
if([writeContext hasChanges]) {
b=[writeContext save:&error];
if(b) {
NSManagedObjectContext *parentContext = [writeContext parentContext];
if(parentContext) {
[parentContext performBlock:^{
[self saveAllWithContext:parentContext success:success failure:failure];
}];
} else {
if(success)
success();
}
} else {
if(failure)
failure(error);
}
}
else {
if(success)
success();
}
}
此方法更新主要上下文和后台主上下文。
希望有所帮助:)