ios - 初始化核心数据 ManagedObjectContext

标签 ios core-data singleton

我正在使用单例数据 Controller 从两个不同的 View 调用我的核心数据函数:创建 View 和历史 View 。

第一个 View 只有创建或查看历史记录按钮以转到相应的 View 。

我的问题是,我必须完成创建过程(在创建 View 中按 create Care)才能从历史 View 中的核心数据接收任何内容。因此,我假设我必须启动我的 ManagedObjectContext。或者我需要初始化一些其他核心数据元素吗?

我在appDelegate中初始化了dataControllerSingelton。然而,我无法弄清楚如何在我的单个初始化方法中初始化托管对象上下文:

+(DataControllerSingleton *)singleDataController{

static DataControllerSingleton * single=nil;

@synchronized(self)
{
    if(!single)
    {
        single = [[DataControllerSingleton alloc] init];
        single.masterCareList = [[NSMutableArray alloc]init];

        //NSManagedObjectContext *managedObjectContext = [[DataControllerSingleton singleDataController] managedObjectContext]; - This lame attempted does not work


    }

}
return single; }

我在 singletonDataController.m 中的 ManagedObjectContext 方法:

 - (NSManagedObjectContext *)managedObjectContext
 {
if (_managedObjectContext != nil) {
    return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}

运行此创建护理方法后,它工作正常:

- (void)insertNewObject:(Care *)care{


NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:    
[entity name] inManagedObjectContext:self.managedObjectContext];

NSString *fileName = care.pictureURL;
NSString *text = care.causeText;
NSDate  *date = care.date;
NSData  *imgData = care.imageData;

[newManagedObject setValue:fileName forKey:@"urlPath"];
[newManagedObject setValue:text forKey:@"name"];
[newManagedObject setValue:date forKey:@"date"];
[newManagedObject setValue:imgData forKey:@"imageData"];

 // Save the context.
[self saveContext]; 
}

任何反馈或提示都会有帮助,我也非常感谢详细的代码!

最佳答案

你很好,这应该可以。您正在正确地惰性地创建托管对象上下文,因此如果尚不存在,则应该创建它。

我认为你的单例绝对是矫枉过正。使用 Apple 样板来初始化应用程序委托(delegate)中的核心数据堆栈,然后为 View Controller 提供一个简单的 managedObjectContext 属性是有意义的。

非常简单,Apple 有几十个这样的示例项目。除非您与 iCloud 异步同步,否则单例没有任何用处。

关于ios - 初始化核心数据 ManagedObjectContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302588/

相关文章:

java - Guice eager/lazy 单例实例化

ios - 如何更改 iOS 8 中选项卡栏图标的选定颜色?

ios - 删除观察员是强制性的(必要的)吗?

ios - 如何停用我的限制?

ios - iPad 上的核心数据获取速度非常慢

ios - 如何以简单的方式备份没有搜索索引的 CoreData 存储 (SQLite)?

.net - 单例 DAL 类

java - DriverManager类是Java中的单例吗?

ios - 在 View Controller 之间共享一个例程

core-data - 解包可选值时意外发现 nil - Swift