2016-03-08 2 views
0

Я знаю, это похоже на простой вопрос, но если я #import <UIKit/UIKit.h> в файл класса, это нарушение правила MVC?MVC и импортирование UIKit

Причина, по которой я спрашиваю, это создать класс, который имеет функцию для вызова API. Внутри этой функции API я хочу использовать метод dispatch_async, чтобы вернуть данные в основной поток и вызывать [tableView reload] внутри этого метода dispatch_async.

Для этого мне нужно иметь доступ к классу UITableView, поэтому, когда я вызываю свою функцию, я могу передать ее в tableView. Извините, но все же несколько нова ко всему этому.

Спасибо!

+0

Вы можете показать через код, что вам делать? –

ответ

2

Прежде всего, MVC - это шаблон дизайна, а не набор правил. Это способ организации кода, чтобы представление (и как его представлять) полностью отделилось от модели/приложения.

Во-вторых, вы уверены, что импорт файла viewController в класс, который вызывает вызовы API (назовем его классом API), противоречит принципам MVC.

Но вы можете сделать обновление обзора в классе viewController! Вместо импорта класса ViewController в класс API вы можете сделать абсолютное обратное и использовать класс API из класса View Controller. Существует множество способов, с помощью которых классы могут взаимодействовать друг с другом в соответствии с шаблоном MVC. Посмотрите на этот article on the website objc.io, который говорит о том же.

Посмотрите на AFNetworking, чрезвычайно популярную сетевую библиотеку для приложений, написанных на Objective-C. Он отлично использует объективные блоки c, и то же самое рекомендуется для вашего использования.

Например, ваш класс для принятия вызова API может выглядеть следующим образом:

//APICall.h 
@interface APICall : NSObject 

-(void)makeAPICallWithHandler:(void(^)(NSError*, id data))handler; 

@end 

//APICall.m 
#import "APICall.h" 

@implementation APICall 

-(void)makeAPICallWithHandler:(void(^)(NSError*, id data))handler 
{ 
    NSError *err; 
    id data; 
    //Make your API call and then pass the result in the handler 

    if (err) 
    { 
     handler(err, nil); 
     return; 
    } 

    handler(nil, data); 
} 

@end 

Описанный выше метод может быть реализован с помощью контроллера представления следующим образом:

//ViewController.m 
#import "ViewController.h" 
#import "APIClass.h" 

@implementation ViewController 
{ 
    APIClass *api; 
    id displayData; 

    __weak IBOutlet UITableView *tableView; 
} 

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    api = [APICall new]; 

    [api makeAPICallWithHandler:^(NSError* error, id data) { 

     if (error) 
     { 
      //Show alert or something 
      return; 
     } 

     displayData = data; 
     [tableView reloadData]; 
    }]; 
} 

@end 

Дело в том, что используя блоки, вы можете сделать данные из вызова API доступными для viewController, который затем может обновить tableView и поддерживать его источник данных. Это соответствует MVC, поскольку вы полностью отделите обновление вида от фактического вызова API.

+0

Удивительный и спасибо за полное объяснение. Я ценю это, и это делает его намного яснее. – dcotter

Смежные вопросы