如何在iOS中最佳地使用MVC模式

6
我长期以来一直在使用MVC模式,但我不确定我是否在iOS中正确地使用了这个模式。
以下是我的理解和源代码,我用它来将模型、视图和控制器分离:
描述:
1. 模型(例如 - MyModel类) 模型就是我的数据。我使用模型来定义计算、从互联网获取数据,然后通过NSNotificationCenter通知控制器模型的更改。
2. 控制器(例如 - MyController类) 控制器可以直接联系请求其模型数据,并直接显示在视图中。
3. 视图(例如 - MyView类) 视图负责显示和收集用户事件。视图可以通过目标操作和委托与控制器交互。
代码:
class MyModel:NSObject
    .h ... (some header code)
    .m
    Initialization method...

    // method for get data from internet
    -(NSData *)my_getDataFromInternet:(NSURL *)url{
       NSData *data=[NSData dataWithContentsOfURL:url];
       return data;    
    }

我的控制器:UIVIewController

     #import "MyView.h"
     .h
     MyView * my_view;

     #import "MyData.h"
     .m
     Initialization method...
     - (void)init{
        my_view = [[MyView alloc]init];
        my_view.my_target = self;
        self.view = my_view;
     }

     -(void)mycontrolleraction{
        MyData * my_data = ...
        [my_data my_getDataFromInternet:some_url_image];
        my_view.my_image = [UIImage imageWithData:self.my_data];
     }

类 MyView 继承自 UIView。

     .h
     UIImage * my_image;
     property(nonatomic, assign)id my_target;
     .m
     Initialization method...
     - (void)initWithFrame{
         UIButton * my_button = ...
         [button addTarget:my_target ....
         my_image = ...
         [self addSubview:my_image];
         [self addSubview:my_button];
      }

我将一个目标添加到我的按钮上 - my_target(my_target是我的MyController)。当用户点击我的按钮时,将在MyController中执行该方法并请求来自我的MyData类的数据。

我想知道在使用MVC中这种方法的错误在哪里。

1个回答

3

看起来你的想法是正确的。通常我认为模型不仅存储数据,还对其进行操作,因此让模型获取图像并仅返回而不保存似乎有点奇怪。让模型保持数据可以避免以后再次获取它,但你现在的方式也没有问题,数据来自哪里应该完全由模型决定。

与MVC无关的一件事是,建议遵循 初始化器的约定。你的初始化方法必须调用超类的指定初始化器,因此你的控制器的-init应该如下:

-(id)init
{
    if ((self = [super init])) {    // double parens to avoid warning about = vs ==
        my_view = [[MyView alloc] init];  // assuming my_view is an ivar
        my_view my_target = self;
    }
    return self;
}

同样适用于你的视图和模型类。

是的,我同意我在初始化方面犯了一个错误。这是因为我在网站上输入了所有代码,而不是在Xcode中,并且有点匆忙。我仅仅制作了这个简单的交互示例,只是为了展示一下交互的过程。这并不是理想的代码 - 只是MVC分割的一个简单示例。感谢您的评论和回答我的问题。 - Matrosov Oleksandr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接