我知道这似乎是一个简单的问题,但是如果我#import <UIKit/UIKit.h>
进入一个类文件中这会打破MVC规则吗?
我问的原因是我设置了一个具有API调用功能的类。在该API函数内部,我想使用dispatch_async
方法将数据返回到主线程,并希望在[tableView reload]
方法内调用dispatch_async
。
要做到这一点,我需要访问UITableView
类,所以当我调用我的函数时,我可以传入tableView。对不起,这还有点新鲜。
谢谢!
答案 0 :(得分:2)
首先,MVC是一种设计模式,而不是一组规则。这是一种组织代码的方式,以便视图(以及如何表示它)与模型/应用程序完全分离。
其次,你说在导入API调用的类中导入viewController文件(让我们称之为API类)是违反MVC原则的。
但是你可以在viewController类本身中进行视图更新!您可以执行绝对反向并使用View Controller类中的API类,而不是将ViewController类导入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,然后viewController可以更新tableView并维护它的数据源。这符合MVC,因为您将完全将视图更新与实际API调用分离。