iPhone应用程序设计决策?

时间:2010-02-25 15:47:38

标签: iphone cocoa-touch model-view-controller

我正在编写一个遵循MVC设计模式的简单应用程序。在Xcode项目中,我有三位:

  1. 的AppDelegate
  2. 的ViewController
  3. 的DataModel
  4. 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 {
    

    非常感谢任何帮助/信息。

    EDIT_001:

    我刚刚查阅了“开始iPhone3开发”一书,其中有一节介绍了“第11章数据持久性”,他们做了一些我认为本来不好的设计。在书中,他们将dataModel符合[NSCoding]并实现编码/解码的方法。然后,他们在viewController中使用viewDidLoad:和applicationWillTerminate:在适当的时候取消/实现。我发现不好的是他们从UITextFields获取数据?我有我希望存储的数据,这些数据未在UI上显示,因此在我的情况下不起作用。你也不应该从dataModel归档/取消存档,而不是通过UI控件查看视图吗?

    EDIT_002:

    越来越近,它现在看起来像你执行以下操作:(两者都在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];
    

    加里

2 个答案:

答案 0 :(得分:1)

我认为这是一个偏好的问题。在某些时候,你需要调用模型方法来保存/加载,你已经找到了几个解决方案。在我正在构建的项目中,当用户进入/退出“主题”区域时,我只会加载/保存某些数据。如果它太慢,我可能会使用在“applicationDidFinishLaunching”调用的单独线程来加载我需要的一些数据部分。然后我会在点击按钮/ tablecellselection时检查线程是否完成。

就个人而言,我会考虑构建数据加载/保存“包装”方法来隐藏大多数模型变量(内部)和复杂性,然后让这些包装器简单地返回成功/失败,并且可能是数据的ptr。

答案 1 :(得分:0)

是的,applicationDidFinishLaunching:和applicationWillTerminate:是加载/保存持久数据的好地方。

如果您要加载大量数据并担心应用程序加载时间过慢,那么您可能需要考虑更加复杂的按需加载内容的策略(此时您可能需要考虑使用CoreData)。 / p>