我已经搜索了这个,但答案太简单了,无法满足我:(
我想将NSManagedObjectContext
从TabBarController
传递到我应用中的几乎所有视图控制器。详细说来,我的故事板结构有点像这样:
TabBarController
>>>几个标签项视图(这很容易通过,只需在相应的视图控制器中传递一次)。但我有另一种关系:TabBarController
(上面提到的那个)>>> NavigationController
>>> TableViewControllerOne
>>> TableViewControllerTwo
,
NSManagedObjectContext
实例从NavigationController
转移到TableViewControllerOne
并转移到TableViewControllerTwo
....这可能涉及很多prepareSegue:sender
并且它是不容易管理。
所以我的问题是:在iOS开发中,有没有一种方法可以创建一个我可以在整个应用程序中轻松访问的“全局”对象?从使用核心数据的主要详细信息视图的apple官方模板中,它实例化app委托中的NSManagedObjectContext
,并将其传递给主视图控制器。如果我在几次视图通过后必须使用此对象怎么办?哇,这是很多代码要做的。
希望我清楚明白,有人可以帮忙:) 非常感谢。
答案 0 :(得分:2)
我认真建议使用MagicalRecord库来满足您的CoreData堆栈要求。
然后您可以执行以下操作:
[NSManagedObjectContext MR_defaultContext];
或
[NSManagedObjectContext MR_contextForCurrentThread];
首先设置CoreData可以很简单:
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"myDatabase.sqlite"];
答案 1 :(得分: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
答案 2 :(得分:1)
我个人喜欢使用ModelController
类的单例对象,我可以将Core Data堆栈相关对象(Context,Model和Store Coordinator)和帮助器方法放在一个地方,然后我可以访问从我的视图控制器的任何地方。像这样:
@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