iOS - 如何将AppDelegate的ManagedObjectContext传递给来自NavigationView的UIViewController

时间:2013-12-18 04:17:36

标签: ios iphone objective-c core-data

我正在努力应对核心数据概念,我需要做一些澄清。

我正在使用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声誉:(

对此核心数据/委派问题的任何帮助都将受到高度赞赏。 谢谢。

2 个答案:

答案 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();
    }
}

此方法更新主要上下文和后台主上下文。

希望有所帮助:)