我正在编写一个使用带有多个选项卡视图的选项卡控制器的测试程序。该程序将下载多个XML文件,并通过Core Data解析并填充sqlite表。核心数据变量和函数位于Xcode创建的代码之后的App Delegate文件中。
首先,我在应用程序委托中将其初始化时,只需将managedObjectContext变量传递给需要它的每个子视图,例如:
FirstViewController *vc1;
vc1 = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];
[vc1 setManagedObjectContext:self.managedObjectContext];
但是,我有一个函数(resetData)删除整个数据存储区-删除持久存储区文件,并将所有Core Data变量(managedObjectContext,managedObjectModel,persistantStore等)设置为nil,重新初始化所有内容。这样一来,程序就可以从头开始,然后从网络中重新下载所有数据。发生这种情况时,子视图现在指向旧的managedObjectContext。
在所有子视图中更新ManagedObjectContext变量的最佳方法是什么?从resetData函数手动更新子视图的ManagedObjectContext变量?使用NSNotificationCenter向所有视图发送通知?完全删除并重新初始化所有持久性存储文件是否会过度使用?
我目前在需要引用MOC的所有类中都使用了这个吸气剂,它仅引用了App Delegate:
- (NSManagedObjectContext *)managedObjectContext {
MyAppDelegate* ad = (MyAppAppDelegate*)[[UIApplication sharedApplication] delegate];
return [ad managedObjectContext];
}
我对Cocoa / iOS设计模式刚起步,正在尝试找出最合适的方法来做这些事情!我现在拥有的东西可以工作,但是我想知道是否存在看不见的陷阱或 future 的问题?谢谢!
最佳答案
恕我直言,将managedObjectContext传递到ViewControllers是一个好习惯。它使测试更加容易,并创建了更好的可重用的ViewController。
一种获得期望结果的方法是简单地从存储中删除所有对象,同时保持CoreData Stack不变。所有视图控制器将只使用与以前相同的上下文,但是不再包含对象。但这可能会变慢,具体取决于对象的数量。
删除所有对象的最快,最有效的方法确实是删除存储文件。 NSManagedObjectContext为持久性存储协调器提供了一个设置器。您是否尝试过使用新文件创建新的storeCoordinator,将其设置为MOC的storeCoordinator,然后释放旧的协调器并删除旧的文件?在这种情况下,您可能需要发送一个Notification,因为所有ViewController都必须释放其可能保留的ManagedObjects。
我想到的另一个想法,就是我以前曾经使用过的方法,就是完全删除完整的viewController堆栈,然后使用新的ManagedObjectContext重新创建它。您可以在后台轻松地下载,解析新数据并将其保存到它自己的单独的ManagedObjectContext中(具有它自己的persistentStoreController和自己的商店)。完成后,从窗口中删除所有控制器,并跟踪显示的控制器。然后移动新的存储文件以覆盖旧的存储文件,并像以前一样重新创建viewController堆栈。虽然这听起来很昂贵,但事实并非如此。就我而言,该切换在用户界面中甚至都不明显。保留viewControllers的好处是,旧的ManagedObjects仍然潜伏在某个地方,从而减少了需要额外编辑的代码,这几乎是不可能的。如果您已经设置了viewControllers,苹果建议该开关将“正常工作”的机会很大。
关于objective-c - 共享托管对象上下文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8470806/