【问题标题】:MVC and importing UIKitMVC 和导入 UIKit
【发布时间】:2016-03-08 05:46:31
【问题描述】:

我知道这似乎是一个简单的问题,但是如果我将#import <UIKit/UIKit.h> 放入一个类文件中,这是否违反了 MVC 规则?

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

为此,我需要访问UITableView 类,因此当我调用我的函数时,我可以传入我的tableView。抱歉,对这一切还是有些陌生。

谢谢!

【问题讨论】:

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

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


【解决方案1】:

首先,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 调用完全分离。

【讨论】:

  • 太棒了,感谢您的完整解释。我很感激它,它使它更清晰。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多