首先,MVC是一种设计模式,而不是一套规则。这是一种组织代码的方式,以便视图(以及如何表示它)完全与模型/应用程序分离。
其次,你说的在导致API调用的类中导入viewController文件(我们称之为API类)违反了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调用中解除视图更新。
你能通过代码显示你要做什么吗? –