MVC并导入UIKit

时间:2016-03-08 05:46:31

标签: ios objective-c model-view-controller uikit

我知道这似乎是一个简单的问题,但是如果我#import <UIKit/UIKit.h>进入一个类文件中这会打破MVC规则吗?

我问的原因是我设置了一个具有API调用功能的类。在该API函数内部,我想使用dispatch_async方法将数据返回到主线程,并希望在[tableView reload]方法内调用dispatch_async

要做到这一点,我需要访问UITableView类,所以当我调用我的函数时,我可以传入tableView。对不起,这还有点新鲜。

谢谢!

1 个答案:

答案 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调用分离。