设置ViewController的managedObjectContext

时间:2012-05-18 12:25:03

标签: ios core-data

我正在使用CoreData,并在NSManagedObjectContext文件中设置了AppDelegate

我需要在一个ViewController中获取该managedObjectContext,它在naviagation树中有很多级别。显然,我不想将它传递给所有init方法。

我已经尝试了[[[UIApplication sharedApplication] delegate] managedObjectContext];但是我收到了这个错误“没有已知的选择器实例方法'managedObjectContext'

有人可以指导我如何从AppDelegateViewContoller获取managedObjectContext吗?

2 个答案:

答案 0 :(得分:13)

首先,您需要在AppDelegate.h中创建一个属性,如下所示:

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; // or strong if you ARC instead of retain

使用readonly阻止您在外部修改上下文。

AppDelegate.m合成它,如:

@synthesize managedObjectContext;

始终在AppDelegate.m内覆盖像

这样的getter方法
- (NSManagedObjectContext *)managedObjectContext
{    
    if (managedObjectContext != nil) return managedObjectContext;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return managedObjectContext;
}

完成后,您有一个managedObjectContext属性,可以通过

随处访问
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

更酷的方法可能是在AppDelegate.h中创建一个类方法,如下所示:

+ (AppDelegate *)sharedAppDelegate;

然后在AppDelegate.m中执行以下操作:

+ (AppDelegate *)sharedAppDelegate
{
    return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

现在,在导入AppDelegate标题(#import "AppDelegate.h")之前的任何地方,您都可以:

AppDelegate* appDelegate = [AppDelegate sharedAppDelegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;

注意

使用这种方法会导致应用程序变得僵硬。为了解决这个问题,我建议你阅读Marcus Zarra撰写的passing-around-a-nsmanagedobjectcontext-on-the-iphone

希望它有所帮助。

答案 1 :(得分:2)

您需要将全局sharedApplication变量强制转换为您自己的应用程序的AppDelegate类。这是一个例子:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];            
// Now you can access appDelegate.managedObjectContext;

注意:您需要在使用此代码的.m文件中#import "AppDelegate.h"