开始沿着'单身人士'的道路走下去。 (哇!!)现在,试图回溯一些步骤并将核心数据堆栈从应用代表中删除。
在对此的讨论中,我看到了以下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions(NSDictionary *)launchOptions {
DataModel *dataModel = [[DataModel alloc] init];
self.rootViewController.dataModel = dataModel;
...
}
在DataModel.m中是核心数据堆栈,启动Web服务的方法和将返回的数据保存到核心数据的方法。连接是另一个类。
启动,启动连接,将托管对象上下文传递给根视图控制器并接收Web数据都可以正常工作。然后,Connection类中的发布通知(在完成数据接收时)通知DataModel要处理的数据。问题是DataModel已被解除分配。该应用程序崩溃。
放弃DataModel的(shhh)单例类之后,问题是:如何保留DataModel来处理接收到的核心数据的Web数据?或者,将核心数据堆栈拆分并将接收到的数据处理成2个文件会更好吗?
将核心数据堆栈和处理方法放在一个类中似乎是合乎逻辑的。我想通过将上下文从控制器传递给控制器来构建这个应用程序。
答案 0 :(得分:0)
我有一个班级," SVODataHelper"有这个:
#pragma mark - Setup
- (id) init
{
self = [super init];
if (!self)
return nil;
_model = [NSManagedObjectModel mergedModelFromBundles:nil];
_coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model];
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_context setPersistentStoreCoordinator:_coordinator];
return self;
}
- (void) loadStore
{
if (_store)
return;
NSError *error = nil;
_store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:nil error:&error];
if (!_store)
{
NSLog(@"Failed to add store. Error: %@", error);
abort();
}
}
- (void) setupCoreData
{
[self loadStore];
}
然后,在AppDelegate中,我使用:
- (SVOData *)svoData
{
if (!_svoDataHelper)
{
static dispatch_once_t predicate;
dispatch_once (&predicate, ^{ _svoDataHelper = [[SVOData alloc] init]; }); // insures a single instance created to guarantee thread safety.
[_svoDataHelper setupCoreData];
}
return _svoDataHelper;
}
最后,我使用以下命令访问辅助类:
svoDataHelper = [(AppDelegate *)[[UIApplication sharedApplication] delegate] svoData];
我不知道它是好还是坏但是有效。我从我读过的一本书("学习IOS核心数据?)中得到了这个概念,它看起来很干净,因为它允许我将基本内容保存在一个单独的类中,同时避免必须将指针传递给该类。