Как лучше всего использовать MVC в iOS

Я давно работаю с MVC но не уверен, что правильно использую этот паттерн в iOS.

Это мое понимание и исходный код, который я использую для разделения на представление модели и контроллер.

Описание:

  1. Модель (например - класс MyModel) Модель это мои данные. Я использую модель для определенного расчета, получения данных из интернета и далее уведомляю контроллер об изменениях в модели например через NSNotificationCenter.

  2. Контроллер (например - класс MyController) Контроллер может напрямую обращаться к запросу данных своей модели, и переходить непосредственно к отображению в поле зрения.

  3. View (например - класс MyView) View - отображение и сбор событий от пользователей. Представление может взаимодействовать с контроллером через целевое действие и делегирование.

Код:

класс 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;    
    }

класс MyController: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.


person Matrosov Alexander    schedule 20.08.2011    source источник


Ответы (1)


Похоже, у вас есть правильная идея. Я обычно думаю о модели как о чем-то, что хранит данные, а также работает с ними, поэтому кажется немного странным, когда модель извлекает изображение, а затем просто возвращает его, не сохраняя. Если модель удерживает данные, это позволит ей избежать повторной выборки позже, но то, как вы это делаете, не является неправильным, и то, откуда берутся данные, должно полностью зависеть от модели.

Я бы предложил одну вещь, не связанную с 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;
}

То же самое касается ваших представлений и классов моделей.

person Caleb    schedule 20.08.2011
comment
Да, я согласен, я допустил ошибку при инициализации. Это потому, что весь код я набирал здесь на сайте, а не в xcode и немного торопился. Я привел этот простой пример взаимодействия просто для того, чтобы показать как происходит взаимодействие. Это не идеальный код — а простой пример разделения на MVC. Спасибо за ваши комментарии и ответ на мой вопрос. - person Matrosov Alexander; 20.08.2011