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

Moy*_*Moy 8 core-data objective-c ios

我对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;
Run Code Online (Sandbox Code Playgroud)

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

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

self.moc = [[NSManagedObjectContext alloc] init];
self.moc.persistentStoreCoordinator = [appDelegate persistentStoreCoordinator];
/*code**/
[self.moc save:&error];
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)
  1. 一个好的做法是为每个视图控制器创建一个NSManagedObjectContext,在那里你将对数据库进行一些更改?
    1.1.使用[UIApplication sharedApplication]从appdelegate获取持久性NSPersistentStoreCoordinator是一种有效的方法吗?
  2. 在主线程和任何其他线程之间共享持久性存储协调器是安全的吗?

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

cha*_*bag 3

我不同意这里的大多数答案。这对#1来说还不错。事实上,在大多数情况下这样做可能是很好的做法。特别是当你有不同的线程运行东西时。它极大地简化了我的应用程序,可以在需要时(包括每个视图控制器)创建 NSManagedObjectContexts。MagicalRecord 背后的人也推荐了这一点(在大多数情况下我用它来利用 Core Data)。对于 MR 人员来说,创建 NSManagedObjectContext 并不是一个高开销的调用。不管怎样,我都不是 CoreData 专家,但按照 MagicalRecord 人员向我推荐的那样,我通过这种方式取得了更好的结果。