ios - 设置 ViewController 的 managedObjectContext

标签 ios core-data

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

我需要在 ViewController 中获取 managedObjectContext,它位于导航树的许多层级深处。显然,我不想将它传递给所有 init 方法。

我已经尝试过 [[[UIApplication sharedApplication] delegate] managedObjectContext]; 但我收到此错误“选择器‘managedObjectContext’没有已知的实例方法

有人可以指导我如何将 managedObjectContext 从 AppDelegate 获取到此 ViewContoller 吗?

最佳答案

首先,您需要在 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 header (#import "AppDelegate.h")之前,您可以:

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

注意事项

使用这种方法会使您的应用程序变得僵化。为了克服这个问题,我建议你阅读 passing-around-a-nsmanagedobjectcontext-on-the-iphone作者:马库斯·扎拉。

希望对您有所帮助。

关于ios - 设置 ViewController 的 managedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10652615/

相关文章:

iphone - 核心数据崩溃 : [__NSArrayM insertObject:atIndex:]: object cannot be nil

ios - 我的所有 iOS ViewControllers 如何获得可用的用户登录信息?

iphone - 屏幕旋转锁定时如何获取设备方向?

ios - 核心数据 iCloud 同步

ios - 查询核心数据中所有实体的快速简便方法

ios - 强制设置核心数据检查点?

ios - swift : Missing Strange Parameter

objective-c - 如何使用 cocos2d 在触摸上移动 Sprite ?

ios - objective-c : Add event to google calendar

iphone - 核心数据 : Keypath "objectID" not found in entity