我正在编写一个遵循MVC设计模式的简单应用程序。在Xcode项目中,我有三位:
DataModel对象包含应用程序的所有数据,我想确保它保存在app-exit上并在app-startup上重新加载。
我不确定这是否是正确的方法,我已将我的DataModel符合NSCoding并添加了encodeWithCoder:和initWithCoder:方法。我在viewController中将我的DataModel声明为:
FlowerStore *flowerStore = [[FlowerStore alloc] init];
据我了解,我需要使用下面列出的AppDelegate方法进行保存和加载:
-(void)applicationDidFinishLaunching:(UIApplication *)application { // LOAD
-(void)applicationWillTerminate:(UIApplication *)application { // SAVE
有人能指出我应该如何做到这一点的正确方向吗?我可以找到直接在相关对象中存档(或取消归档)数据的所有示例(见下文),我需要在应用程序启动/退出时进行加载和保存?
-(void)encodeWithCoder:(NSCoder *)encoder {
-(id)initWithCoder:(NSCoder *)decoder {
非常感谢任何帮助/信息。
我刚刚查阅了“开始iPhone3开发”一书,其中有一节介绍了“第11章数据持久性”,他们做了一些我认为本来不好的设计。在书中,他们将dataModel符合[NSCoding]并实现编码/解码的方法。然后,他们在viewController中使用viewDidLoad:和applicationWillTerminate:在适当的时候取消/实现。我发现不好的是他们从UITextFields获取数据?我有我希望存储的数据,这些数据未在UI上显示,因此在我的情况下不起作用。你也不应该从dataModel归档/取消存档,而不是通过UI控件查看视图吗?
越来越近,它现在看起来像你执行以下操作:(两者都在viewController中)
-(void)viewDidLoad { // LOAD
-(void)applicationWillTerminate:(NSNotification *)notification { // SAVE
注意:applicationWillTerminate使用NSNotification而不是UIApplication,另外还需要将以下代码添加到viewDidLoad的底部。
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:app];
加里
答案 0 :(得分:1)
我认为这是一个偏好的问题。在某些时候,你需要调用模型方法来保存/加载,你已经找到了几个解决方案。在我正在构建的项目中,当用户进入/退出“主题”区域时,我只会加载/保存某些数据。如果它太慢,我可能会使用在“applicationDidFinishLaunching”调用的单独线程来加载我需要的一些数据部分。然后我会在点击按钮/ tablecellselection时检查线程是否完成。
就个人而言,我会考虑构建数据加载/保存“包装”方法来隐藏大多数模型变量(内部)和复杂性,然后让这些包装器简单地返回成功/失败,并且可能是数据的ptr。
答案 1 :(得分:0)
是的,applicationDidFinishLaunching:和applicationWillTerminate:是加载/保存持久数据的好地方。
如果您要加载大量数据并担心应用程序加载时间过慢,那么您可能需要考虑更加复杂的按需加载内容的策略(此时您可能需要考虑使用CoreData)。 / p>