首先,MVC 是一种设计模式,而不是一套规则。这是一种组织代码的方式,以便视图(以及如何表示它)与模型/应用程序完全分离。
其次,您说得对,在进行 API 调用的类(我们称之为 API 类)中导入 viewController 文件是违反 MVC 原则的。
但是您可以在 viewController 类本身中更新视图!无需将 ViewController 类导入 API 类,您可以完全相反地使用 View Controller 类中的 API 类。在符合 MVC 模式的同时,类可以通过多种方式相互通信。看看这个article on the website objc.io,它讲了同样的事情。
看看AFNetworking,这是一个非常流行的网络库,适用于用 Objective-C 编写的应用程序。它很好地利用了objective-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 调用完全分离。