- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个要重构的当前代码库。 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 ?
最佳答案
有几个概念对我编写易于维护的代码很有用:
除了具体的模型对象(例如,如果从服务请求天气信息,您可能有一个代表特定天气报告的 Weather
类,例如 city
、temperature
和 narrative
属性),我还将使用一个数据 Controller 对象来协调从缓存、持久存储、或来自网络,视情况而定(通常按此顺序)。您要警惕仅依赖简单的 Web 服务请求,因为在设计响应式 UI 时缓存等可能非常重要。
对我来说关键点是我很少希望 View 或 View Controller 弄乱这种级别的细节(尽管我承认,在琐碎的情况下,我直接从 Controller 完成请求)。理想情况下, View Controller 将启动我的数据 Controller 的异步请求,向其传递一个带有以下参数的完成 block :(a)正在检索的模型对象;和 (b) NSError
。
我将在下面提供一个示例。
正如您可能从上面推断的那样,我也经常将网络请求的发起和响应解析到它们自己的对象中的细节抽象化(因为数据 Controller 可能足够复杂,管理缓存,持久存储等)。我通常使用 NSOperation
子类来执行请求/解析任务(它适用于带有完成 block 的异步请求;如果 UI 移动到其他地方,则能够取消挂起的请求,等等)。因此,如果我的数据 Controller 得出缓存和/或持久存储无法满足请求的结论,它将启动异步请求/解析操作。
您列出了分配给 View Controller 的一些其他职责,但最好也抽象出来:
1.2) 处理手势 - 如果手势变得有点复杂(例如,仅水平、从边缘滑动等),我实际上会将手势处理程序子类化,从而大大简化 View Controller 自身与手势的交互处理程序。
3) 自定义 UI - 如果 UI 需要大量自定义,我通常也会将适当的 View 子类化。特别是 UITableViewCell
和 UICollectionViewCell
,这可以大大简化 View Controller 代码。任何需要任何 Material 定制的 View 通常都可以在 View 本身的子类中更优雅地完成。
所以,我可能有一个这样定义的完成 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/
是否可以简化在裸机上运行的这条链: 具有随时间变化的副本数的 StatefulSet 服务 使用 proxy-next-upstream: "error http_502 timeout invali
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要为应用程序制定架构。它专为销售产品而设计。 系统每天将接受大约 30-40k 的新产品。它将导致在表 product 中创建新记录。 系统应保留价格历史记录。用户应该能够看到产品 A 的价格在去
我需要一些帮助来理解 PHP 的内部工作原理。 还记得,在过去,我们曾经写过 TSR(Terminate and stay resident)例程(pre-windows 时代)吗?一旦该程序被执行,
1.Nginx 基础架构 nginx 启动后以 daemon 形式在后台运行,后台进程包含一个 master 进程和多个 worker 进程。如下图所示: master与
本文深入探讨了Kubernetes(K8s)的关键方面,包括其架构、容器编排、网络与存储管理、安全与合规、高可用性、灾难恢复以及监控与日志系统。 关注【TechLeadCloud】,
我知道 CNN 的工作原理,包括每一层的用途(Dropout、Pooling 等)。但是,在为新数据集设计 CNN 时,我不知道要使用多少个 Conv-Relu-Pool 层,在最终获得输出之前我应该
在基于 REST 的架构中,资源和方法之间有什么区别。有吗? 最佳答案 资源是您的应用程序定义的东西;它们与物体非常相似。方法是 HTTP 动词之一,例如 GET、POST、PUT、DELETE。它们
我想用 oneOf仅在 xyType 的值上不同的模式属性(property)。我想要其中两个:一个是 xyType设置为 "1"第二个在哪里xyType是 任何其他值 .这可以使用 json 模式完
寻求 PHP 架构师的建议! 我对 PHP 不是很熟悉,但已经接管了一个用该语言编写的大型分析包的维护工作。该架构旨在将报告的数据读取到大型键/值数组中,这些数组通过各种解析模块传递,以提取每个模块已
这些存在吗? 多年来,我一直是大型强类型面向对象语言(Java 和 C#)的奴隶,并且是 Martin Fowler 及其同类的信徒。 Javascript,由于它的松散类型和函数性质,似乎不适合我习
我已经阅读了 Manning 的 Big Data Lambda Architecture ( http://www.manning.com/marz/BD_meap_ch01.pdf ),但仍然无法
在过去的几年里,我做了相当多的 iOS 开发,所以我非常熟悉 iOS 架构和应用程序设计(一切都是一个 ViewController,您可以将其推送、弹出或粘贴到选项卡栏中)。我最近开始探索正确的 M
我有以下应用程序,我在其中循环一些数据并显示它。 {{thing.title}} {{thing.description}}
昨天我和我的伙伴讨论了我正在开发的这个电子购物网站的架构。请注意,我为此使用 ASP.NET。他非常惊讶地发现我没有将添加到购物车的项目保留在 ArrayList 或其他通用列表中,而是使用 LINQ
我正在使用在 tridion 蓝图层次结构中处于较低位置的出版物。从蓝图中较高级别的出版物继承的一些内容和模式不适合我的出版物,并且永远不会被我的出版物使用。 我将跟进添加这些项目的内部团队,并尝试说
我目前已经在 Cassandra 中设计了一个架构,但我想知道是否有更好的方法来做事情。基本上,问题在于大多数(如果不是全部)读取都是动态的。我构建了一个分段系统作为应用程序服务,读取动态自定义查询(
我正在按照 documentation 中给出的 icingaweb UI v 2.0 布局执行在服务器上设置 icinga 的步骤。 。我成功进入设置页面,该页面要求您输入 token ,然后按照步
我必须保存来自不同社交媒体的用户的不同个人资料。例如用户可能有 1 个 Facebook 和 2 个 Twitter 个人资料。如果我保存每个配置文件它作为新文档插入不同的集合中,例如 faceboo
我的团队使用 Puppet 架构,该架构目前可在多个环境(流浪者、暂存、生产)中容纳单个应用程序。 我们现在想要扩展此设置的范围以支持其他应用程序。他们中的许多人将使用我们已经定义的现有模块的子集,而
我是一名优秀的程序员,十分优秀!