2016-03-08 69 views
0

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

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

为此,我需要访问UITableView类,所以当我调用我的函数时,我可以通过我的tableView。对不起,这件事还是有点新鲜的。

谢谢!

+0

你能通过代码显示你要做什么吗? –

回答

2

首先,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调用中解除视图更新。

+0

真棒,感谢您的完整解释。我很感激它,它使它更清晰。 – dcotter