如何正确地管理每个视图控制器中的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;
1.1。 使用[UIApplication sharedApplication]从持久性NSPersistentStoreCoordinator构建appdelegate是一种有效的方法吗?
任何帮助将不胜感激 :)。
我将不同意这里的大部分答案。 它对#1并不坏。 事实上,在大多数情况下,这可能是很好的做法。 特别是如果你有不同的线程运行的东西。 它极大地简化了我的应用程序,以便在需要时创建NSManagedObjectContexts,包括每个视图控制器。 这也是MagicalRecord背后的人推荐的(这是我在大多数情况下使用Core Data的原因)。 MRManagedObjectContext的创建不是每个MR人员的高开销呼叫。 我不是任何想象力的CoreData专家,但我已经有了更好的结果,正如MagicalRecord所推荐给我的那样。
我只能为#1问题提供帮助。 以下是Apple文档在将视图传递给视图控制器时的含义的示例。 在这种情况下,应用程序委托在应用程序委托创建上下文后将上下文传递到根视图控制器。
// in AppDelegate.m (using storyboard)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// let's assume that your MyViewController is the root view controller; grab a reference to the root view controller
MyViewController *rootViewController = (MyViewController *)self.window.rootViewController;
// initialize the Core Data stack...
rootViewController.moc = ... // pass the context to your view controller
return YES;
}
NSManagedObjectContext
并不好。 所有你需要的是为每个线程拥有自己的上下文。 所以这取决于你的逻辑。 1.1。 是的,这并不坏。 在我的应用程序中,我使用带有共享NSPersistentStoreCoordinator
的单例类。 如果我需要创建新的上下文,我使用
self.context = [NSManagedObjectContext new];
self.context.persistentStoreCoordinator = [[SharedStorage sharedStorage] storeCoordinator];
这里有一些详细的代码片段。 通常我的视图控制器使用NSManagedObjectContext
有表视图,所以我使用NSFetchedResultsController
。 而且我对所有这些控制器只使用一个共享上下文。
注1:有人说单身人士是不好主意。
注2:不要忘记,您需要通过save
和merge
方法同步所有上下文。
上一篇: How to correctly manage the NSManagedObjectContext in each view controller?
下一篇: How to tell UICollectionView to preload a larger range of cells?