1

我已经搜索过了,但答案太简单了,无法满足我:(

我想将NSManagedObjectContextfrom传递给TabBarController我的应用程序中的几乎每个视图控制器。详细来说,我的故事板结构是这样的:

TabBarController>>> 几个选项卡项目视图(这很容易通过,只需在相应的视图控制器中传递一次)。但我有另一个关系:(TabBarController上面提到的那个) >>> NavigationController>>> TableViewControllerOne>>> TableViewControllerTwo

现在是灾难。因为基本上我必须将NSManagedObjectContext实例从NavigationControllertoTableViewControllerOne和 to转移到TableViewControllerTwo....这可能涉及很多prepareSegue:sender并且不容易管理。

所以我的问题是:在 iOS 开发中,有没有一种方法可以创建一个可以在整个应用程序中轻松访问的“全局”对象?从苹果官方使用核心数据的主从视图模板中,它实例化了NSManagedObjectContext应用内委托,并将其传递给主视图控制器。如果在几次视图传递后我必须使用这个对象怎么办?哇,有很多代码要做。

希望我说清楚了,有人可以提供帮助:)非常感谢。

4

3 回答 3

2

强烈建议您使用MagicalRecord库来满足您的 CoreData 堆栈要求。

然后,您可以执行以下操作:

[NSManagedObjectContext MR_defaultContext];

或者

[NSManagedObjectContext MR_contextForCurrentThread];

首先设置你的 CoreData 可以很简单:

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"myDatabase.sqlite"];

于 2013-05-16T13:30:23.550 回答
1

就我个人而言,我喜欢使用一个ModelController类的单例对象,我可以将核心数据堆栈相关的对象(上下文、模型和存储协调器)和辅助方法放在一个地方,然后我可以从视图控制器中的任何地方访问它们。像这样的东西:

@implementation ModelController

- (NSManagedObjectModel *)managedObjectModel
{
    // ...
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    // ...
    return _persistentStoreCoordinator;
}

- (NSManagedObjectContext *)contextForCurrentThread
{
    NSManagedObjectContext *context = [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"];
    if (context == nil)
    {
        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:self.persistentStoreCoordinator];

        [[NSThread currentThread] threadDictionary][@"threadManagedObjectContext"] = context;
    }
    return context;
}

- (void)resetCoreDataStack
{
    [[[NSThread currentThread] threadDictionary] removeObjectForKey:@"threadManagedObjectContext"];
    self.persistentStoreCoordinator = nil;
    self.managedObjectModel = nil;
}

+ (ModelController *)sharedModelController
{        
    static ModelController *modelController;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        modelController = [[ModelController alloc] init];
    });
    return modelController;
}
@end
于 2013-05-16T13:37:23.000 回答
1

我使用以下共享存储理念,它创建了一个单例。这对我来说在全局存储不同的东西时相当灵活(代码改编自 iOS Programming The Big Nerd Ranch Guide)。

在下面的代码中,我有一个 PartStore 类,它将始终返回相同的 PartStore 实例。

要访问此实例,只需在需要访问共享存储的类中包含 PartStore.h 并使用类方法检索实例:

[PartStore sharedStore];

然后,您可以访问该类的实例中包含的任何属性。

// PartStore.h
#import "PartData.h"

@interface PartStore : NSObject

@property (nonatomic, strong) PartData *scannedData;

+ (PartStore *)sharedStore;

@end

// PartStore.m
@implementation PartStore

+ (PartStore *)sharedStore
{
    static PartStore *sharedStore = nil;
    if (!sharedStore) {
        sharedStore = [[super allocWithZone:nil] init];
    }

    return sharedStore;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [self sharedStore];
}


@end
于 2013-05-16T13:22:29.883 回答