【问题标题】:Accessing the model from the viewcontrollers?从视图控制器访问模型?
【发布时间】:2012-08-23 11:29:57
【问题描述】:

我正在创建一个 iPhone 应用程序、一个游戏,并且我正在尝试理解和接受 MVC 架构。我计划创建一个模型,在本例中称为 HighScoresModel,它负责保存有关我游戏中高分的所有信息。

  1. 应该在哪里创建这个模型?在 AppDelegate 中?在第一个视图控制器中?
  2. 其他视图控制器应该如何访问模型以传递像addScore:withDifficulty: 这样的消息?

【问题讨论】:

    标签: iphone ios model-view-controller uiviewcontroller model


    【解决方案1】:

    我认为最好的选择是在HighScoresModel 上拥有一个类方法,该方法将从任何需要它的对象访问模型的单个共享实例。

    这优于其他选项,因为没有控制器负责实例化模型,并且控制器也没有不必要地耦合到应用委托。

    举个例子:

    @interface HighScoresModel : NSObject
    
    + (HighScoresModel *)sharedHighScoresModel;
    ...
    
    @end
    
    @implementation HighScoresModel
    
    static HighScoresModel *SharedHighScoresModel;
    
    + (HighScoresModel *)sharedHighScoresModel
    {
        if (!SharedHighScoresModel)
        {
            SharedHighScoresModel = [[HighScoresModel alloc] init];
        }
    
        return SharedHighScoresModel;
    }
    
    ...
    
    @end
    

    希望这会有所帮助!

    【讨论】:

    • 好的,所以基本上是单身?这是否被普遍接受为做这些事情的适当方式?我问是因为过去我使用过单例,并被告知它们是一种相当老套的做事方式。
    • 将它放在应用程序委托中也是一个单例 - 但只是将所有代码专门引入到应用程序的委托中,并降低了可重用性和可测试性。我愿意听到其他替代方案,或者认为这是不可接受的hacky的论点,特别是当您的高分模型必须由控制器层中的多个类访问时。但是如果只有一个视图控制器需要它,并且可以在视图控制器的生命周期内完成持久化,那么让控制器实例化它并保留它可能是合适的。
    • 如果这个模型需要从文件中加载数据,应该在哪里加载。我应该把它放在 AppDelegate 的 didFinishLaunching 方法中吗?
    • 这可能应该是您的HighScoresModel 的责任,并且可能会进入它的 init 方法或任何强制它重新加载数据的方法。
    【解决方案2】:

    创建一个 Singleton 并在其中创建 HighScoresModel。可以从所有 ViewController 访问单例。

    至于其他视图控制器传递消息,您将能够在控制器内的任何位置执行类似的操作。

    [MySingleTon myHighScoresModel] addScore:myScore withDifficulty:myDifficulty];

    有关单例http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/的更多参考,请参见以下链接

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多