【发布时间】:2011-12-12 06:48:57
【问题描述】:
我正在编写一个测试程序,它使用具有多个选项卡视图的选项卡控制器。该程序通过 Core Data 下载多个 XML 文件、解析和填充 sqlite 表。 Core Data 变量和函数位于 Xcode 创建代码之后的 App Delegate 文件中。
我首先将 managedObjectContext 变量传递给需要它的每个子视图,因为我在 App Delegate 中对其进行了初始化,例如:
FirstViewController *vc1;
vc1 = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];
[vc1 setManagedObjectContext:self.managedObjectContext];
但是,我有一个函数 (resetData) 可以删除整个数据存储——删除持久存储文件并将所有核心数据变量(managedObjectContext、managedObjectModel、persistentStore 等)设置为 nil,重新初始化所有内容。这样程序就可以从头开始并从网络重新下载所有数据。发生这种情况时,子视图现在指向旧的 managedObjectContext。
在所有子视图中更新 managedObjectContext 变量的最佳方法是什么?从 resetData 函数手动更新子视图的 managedObjectContext 变量?使用 NSNotificationCenter 向所有视图发送通知?完全删除并重新初始化所有持久存储文件是否过大?
我目前已将这个仅引用回 App Delegate 的 getter 放在所有需要引用 MOC 的类中:
- (NSManagedObjectContext *)managedObjectContext {
MyAppDelegate* ad = (MyAppAppDelegate*)[[UIApplication sharedApplication] delegate];
return [ad managedObjectContext];
}
我对 Cocoa / iOS 设计模式非常陌生,我正在尝试找出最合适的方法来做这些事情!我现在得到的东西有效,但我想知道是否有看不见的陷阱或未来的问题?谢谢!
【问题讨论】:
-
“完全删除并重新初始化所有持久存储文件是否过大?”大概。您可以删除所有对象吗?
-
@jrturton 删除所有对象绝对值得一试。但是如果有很多,它可能会很慢。 CoreData 不是数据库。
-
@tonklon - 当然可以。但是从这个问题我们不知道有多少物体。你的回答非常好。重新创建 VC 堆栈是要走的路
-
我走现在这条路的原因——把它全部扔掉然后重新开始——是因为删除对象似乎相当慢。
标签: objective-c ios cocoa-touch core-data