gpt4 book ai didi

ios - MVC架构中 Controller 的职责

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:09:12 25 4
gpt4 key购买 nike

我有一个要重构的当前代码库。 Controller (对于熟悉 iOS 的人来说是 View Controller )大约有 2000 行,并且做了很多事情。

Controller is responsible for : 1) Communicating between view and model1.1) Handling callbacks / actions from view1.2) Handling gestures.1.3) Passing data from model to view. 2) Making web request if model is empty. 2.1) preparing URL and sending request to connection handler. 2.2) Parsing logic3) Customizing UI 3.1) Minor UI modifications. 4) Business logic. 4.1) A little bit of code deals with business logic of calculation some reports. 

我正在考虑将一些职责委派给模型和 View 。关于如何去做的任何想法?

另外,更具体地说,我想知道谁负责制作网络请求模型或 Controller ?

最佳答案

有几个概念对我编写易于维护的代码很有用:

  1. 除了具体的模型对象(例如,如果从服务请求天气信息,您可能有一个代表特定天气报告的 Weather 类,例如 city temperaturenarrative 属性),我还将使用一个数据 Controller 对象来协调从缓存、持久存储、或来自网络,视情况而定(通常按此顺序)。您要警惕仅依赖简单的 Web 服务请求,因为在设计响应式 UI 时缓存等可能非常重要。

    对我来说关键点是我很少希望 View 或 View Controller 弄乱这种级别的细节(尽管我承认,在琐碎的情况下,我直接从 Controller 完成请求)。理想情况下, View Controller 将启动我的数据 Controller 的异步请求,向其传递一个带有以下参数的完成 block :(a)正在检索的模型对象;和 (b) NSError

    我将在下面提供一个示例。

  2. 正如您可能从上面推断的那样,我也经常将网络请求的发起和响应解析到它们自己的对象中的细节抽象化(因为数据 Controller 可能足够复杂,管理缓存,持久存储等)。我通常使用 NSOperation 子类来执行请求/解析任务(它适用于带有完成 block 的异步请求;如果 UI 移动到其他地方,则能够取消挂起的请求,等等)。因此,如果我的数据 Controller 得出缓存和/或持久存储无法满足请求的结论,它将启动异步请求/解析操作。

  3. 您列出了分配给 View Controller 的一些其他职责,但最好也抽象出来:

    • 1.2) 处理手势 - 如果手势变得有点复杂(例如,仅水平、从边缘滑动等),我实际上会将手势处理程序子类化,从而大大简化 View Controller 自身与手势的交互处理程序。

    • 3) 自定义 UI - 如果 UI 需要大量自定义,我通常也会将适当的 View 子类化。特别是 UITableViewCellUICollectionViewCell,这可以大大简化 View Controller 代码。任何需要任何 Material 定制的 View 通常都可以在 View 本身的子类中更优雅地完成。


示例数据 Controller 抽象

所以,我可能有一个这样定义的完成 block :

typedef void(^WeatherRequestCompletion)(WeatherReport *weatherReport, NSError *error);

然后我的数据 Controller 中可能有一个方法,其接口(interface)如下:

- (WeatherRequest *)requestWeatherWithIdentifier:(CityIdentifier)cityIdentifier completion:(WeatherRequestCompletion)completion;

我的 View Controller 会像这样使用它:

typeof(self) __weak weakSelf = self;

self.weatherRequest = [[WeatherModel sharedController] requestWeatherWithIdentifier:self.cityIdentifier completion:^(WeatherReport *weatherReport, NSError *error) {
if (error) {
// handle error
}
if (weatherReport) {
weakSelf.cityLabel.text = weatherReport.city;
weakSelf.tempLabel.text = [weatherReport.temperature stringValue];
weakSelf.narrativeLabel.text = weatherReport.narrative;
}
}];

View Controller 不应该担心请求的格式以及响应的解析方式(这是我的网络请求 NSOperation 子类的工作)。 View Controller 也不应该过多地参与缓存和/或持久存储逻辑(这是我的数据 Controller 的工作)。因此, View Controller 应该被提炼成非常合乎逻辑且易于理解的东西。

请注意,您会注意到我的数据 Controller 正在返回一个请求对象(对我来说,这通常只是 NSOperation 的 typedef)。我会让我的 View Controller 维护对此的 weak 引用,这样我就可以在需要时轻松取消请求,例如在 View Controller 的 dealloc 中:

- (void)dealloc
{
[_weatherRequest cancel];
}

关于ios - MVC架构中 Controller 的职责,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com