ios – 如何在每个视图控制器中正确管理NSManagedObjectContext?

我是CoreData的新手,我想知道我是否做得对.首先文档说:

“按照惯例,您从视图控制器获取上下文.但您必须适当地实现应用程序,以遵循此模式.

实现与Core Data集成的视图控制器时,可以添加NSManagedobjectContext属性.

创建视图控制器时,将它传递给它应该使用的上下文.您传递现有上下文,或者(在您希望新控制器管理一组离散编辑的情况下)为您创建的新上下文.应用程序委托通常负责创建一个上下文以传递给显示的第一个视图控制器.“
https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html

所以我要做的是为我的NSManagedobjectContext创建一个属性

MyViewController.H
@interface MyViewController : ViewController
{
    NSManagedobjectContext *moc;
}

@property (nonatomic,retain) NSManagedobjectContext *moc;

@end

 MyViewController.m
 @implementation MyViewController
 @synthesize moc=moc;

1. – 我想做的任何地方都会对数据库进行一些更改.

MainNexarappDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];

self.moc = [[NSManagedobjectContext alloc] init];
self.moc.persistentStoreCoordinator = [appDelegate persistentStoreCoordinator];
/*code**/
[self.moc save:&error];

2 – .如果我要在不同的线程中工作,我有自定义方法来创建带有nsprivateQueueConcurrencyType的NSManagedobjectContext,因此可以在私有队列中进行管理:

//Myclass NSObject<br>

 -(NSManagedobjectContext *)createManagedobjectContext{

    MainNexarappDelegate *appDelegate =
    [[UIApplication sharedApplication] delegate];

    NSPersistentStoreCoordinator *coordinator = [appDelegate persistentStoreCoordinator];
    if (coordinator != nil) {
        __managedobjectContext = [[NSManagedobjectContext alloc] initWithConcurrencyType:nsprivateQueueConcurrencyType];

        [__managedobjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedobjectContext;  
}
//__managedobjectContext is my property from the .h file 
//@property (readonly,strong,nonatomic)  NSManagedobjectContext* managedobjectContext;

>一个好的做法是为每个视图控制器创建一个NSManagedobjectContext,在那里你将对数据库进行一些更改?
1.1.使用[UIApplication sharedApplication]来获取持久的NSPersistentStoreCoordinator形成appdelegate是一种有效的方法吗?
>在主线程和任何其他线程之间共享持久存储协调器是安全的吗?

任何帮助将不胜感激 :).

解决方法

我将不同意这里的大多数答案.它对#1来说并不坏.事实上,在大多数情况下这样做可能是一种好习惯.特别是如果你有不同的线程运行的东西.它极大地简化了我的应用程序,以便在需要时创建NSManagedobjectContexts,包括每个视图控制器.这也是MagicalRecord背后的人推荐的(在大多数情况下,我使用它来使用Core Data).根据MR人员的说法,NSManagedobjectContext创建并不是一个很高的开销.我不是任何想象力的CoreData专家,但是我这样做的效果要好得多,正如MagicalRecord人员所推荐的那样.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...