iOS框架MVC+MVVM结合的实战

框架对整个应用程序的作用非常重要,记得有个朋友说过:用什么框架啊,好好封装一下不就行了吗?但我的理解是,好的封装绝对可以事半功倍,但是如果不按照一定的规则进行封装就会让人有些难以理解了,维护代码的人要疯掉了,我认为架构就是规定怎么去封装的。

在拜读的大神们对框架的构思之后,我决定在我们的项目中进行实践一下。刚到了一家新公司,公司的代码极烂,没有什么设计思想,最终导致controller类的代码达到2000行,最多的三千行,非常不利于代码的复用,本来极为类似的界面,继承一下就可以搞定的东西,竟然实现了两次,可以公共使用的东西就更多了,所以激起了我对代码进行优化的想法。

我们的程序是运行于iPad上的,所以每个viewcontroller的控件和事件比较多,导致的代码集中到了VC上,读过被误解的 MVC 和被神化的 MVVM后,决定使用优化过后的MVC。

View,就像大神的分析view是一个层,可能有多个类组成,我们的界面以前是storyboard编写的,我不准备用用纯代码实现一遍,于是加了个viewUtil的类,让所有的view上的属性也作为viewutil的属性,这个类我准备用来监听viewModel(借鉴MVVM)的属性,一旦viewModel的属性进行改变,view也要进行改变,view的改变就在viewUtil类中进行实现。这样view这一层(初始化和改变状态)有了处理的地方了。

ViewModel,借鉴MVVM可以让架构的思路更清晰。我们平时用于数据传输的model用来存放网络上请求过来的数据的,不一定和页面上的元素一一对应。比如页面上有个开关,用于控制某个东西的显示和隐藏的,model里不会存放,这个时候我们在viewModel创建一个bool属性showSth,就是将一个页面所有的可变元素和viewModel的属性一一对应,这样我们在viewcontroller里修改了showSth=YES;由于view监听了viewModel的这个属性,让某个东西显示了。这样逻辑就变的清晰了,界面转化成了具体的属性来操控。

viewModel也是用来存放数据(例如网络请求的结果数组)和处理逻辑(排个序什么的)的地方,但是不包括网络请求,因为网络请求也放到viewModel里的话,viewModel就会变成第二个viewcontroller,不利于对程序流程的掌控,还有就是大量的代码从viewcontroller转移到了viewModel。

viewController, viewcontroller还是用来接收所有交互的,只不过做了一个中转作用(至于如何做中转,下面会有介绍),交给其他的类进行处理,这么做可以减少viewcontroller里的代码,又可以把所有的交互处理集中到了一个地方,可以方便调试快速找到问题。

Service,这个类处理网络请求,做成功和失败的判断处理,还可以加工数据把数据加工成viewModel类所需要的类型,比如数组包含相应类型的Model之类的。

Model,数据存储的类,就是我们平时使用的Model,可以进行数据持久化的处理。

所以一个完整的交互流程大概是这个样子,例如view接收到了点击某个按钮的事件,view用代理回调给viewcontroller做处理,比如要去请求来数据进行展示,就调用service类进行网络请求,返回结果后又会回到viewcontroller里,然后viewcontroller将数据赋值给viewModel的属性dataSourceArray里面,这个时候由于view监听了dataSourceArray这个属性,view就会直接调用tableView进行刷新。这样就是这个架构的交互流程。

将view和view的刷新放到view层,网络请求进行独立,viewcontroller处理所有的东西,viewModel处理运算逻辑等和对页面的元素进行表示和控制,这是整个架构基本的对类职责进行规定。

为什么不在请求成功后让viewcontroller直接调用view的方法进行更新呢,你也可以这么做,由于我对框架的理解不够深刻,所以只能这么回答。

如果闲tableView碍事就可以这么处理:

  • 将 UITableView 的 Data Source 分离到另外一个类中。

别人总结的方法,还没进行实践,只是感觉这么分下去有点更乱了。等有时间实践下。

我们的项目中有个viewcontroller是从1500行减少到800行,虽然较少的不是太多,但是感觉逻辑更清晰了,新增的东西会有一个明确的地方处理,感觉更规范了。

最后感觉架构的使用还是分项目和分页面的,比较简单的界面不用什么架构,复杂的可以尝试划分。对框架的理解比较肤浅,可能有很多理解不对的地方,以后会改正吧。

参考资料:

被误解的 MVC 和被神化的 MVVM

猿题库 iOS 客户端架构设计

浅谈iOS中MVVM的架构设计与团队协作

时间: 2024-10-31 07:27:24

iOS框架MVC+MVVM结合的实战的相关文章

PHP项目感悟 -- 从CI框架来看iOS的MVC

其实这几天一直都想找时间把这个感悟整理出来,也是这一段一直思考的问题,因为这一段参加一个PHP后台项目的开发,框架使用的是CI,随着项目的进展,对于CI接触的也越多,但是由于理解的可能并不深刻,我也只是看到了我所看到的,所以如果有不对的地方,欢迎给出意见和指正. 这几天接触CI框架,发现它的MVC模式运用的如此清晰简洁,完全按照MVC的分别组织模块,而且Model.View与Controller的交互只要调用方法就可以,如果有大量交互,Controller里的方法数量或许会增多,但也可以分模块的

关于iOS中MVC和MVVM的一些思考

事情从一般开发中一个massive viewController说起,一个巨大的vc一般少则上千行代码,多则上万行. 这中情况下对代码的维护有致命性的障碍,个人亲身体验. 当你试着从6000行的代码中去找到一个网络请求,找到相关的实现逻辑,这已经能够让你眼花缭乱的. 更进一步,如果你打算对某个逻辑,某个场景进行测试,那事情的困难程度非常大. 再者,如果你想重用某一部分的场景逻辑,那几乎不可能,因为所有的代码都耦合在一个vc中了. 为什么会造成一个vc的代码这么多,这么复杂呢? 一般有以下原因:

iOS开发——MVC详解&Swift+OC

MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过既然能看到这篇文档,说明你已经开始着手学习并且想深入研究它了,个人也是研究很久才搞懂,就写下来希望对各位有用,也能方便自己以后开发中查看,好了废话不多说,下面就来详细介绍一下MVC,并且用实例验证一下在项目开发中怎么去使用它. 相信你对 MVC 设计模式 并不陌生,只是不能完全理解其中的含义或者不能

iOS性能优化:Instruments使用实战

iOS性能优化:Instruments使用实战 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的用户使用Guide,当然如果不习惯官方英文可以在这里找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数

【IOS 开发】IOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

一. IOS 项目简介 1. IOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类和资源; (1) HelloWorld 目录 HelloWorld 目录介绍 : -- 命名规则 : 该目录名称与 IOS 项目名称相同, 是主目录; -- 存放内容 : IOS 项目的 源码文件, 界面设计文件, 资源文件都存放在该目录下; -- 源文件 : Objective C 的 .m 和

闲话iOS的MVC设计模式

模式是经验知识的复制应用.MVC设计模式在不同的开发平台有不同阐述和应用.目前在网路上可以搜索出java版本.c++版本.c#版本的,也有ios版本的.我这里也发布这篇关于MVC设计模式的文章,用我的缘走你的路. 写在前面的话 若然不用设计模式,难道就不能开发设计程序了吗?不然.那么设计模式给我们带来什么呢?如果你不学习别人总结出来的设计模式,就能轻松.快捷.真正地解决问题,而且还乐意再来一次,我相信你不需要别人的设计模式了.如果??某些问题,让你很挠头,让你不敢再回首,不妨借助别人总结出来的设

iOS中MVC等设计模式详解

iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计模式是被大家广为熟悉和使用的模式,实际上在移动开发中尤其ios开发中,这种模式被发挥到淋漓尽致 MVC设计模式包括三个部分:模型.视图和控制器. 模型包含数据.信息,逻辑,或对象被认为是部分的业务层的iOS应用. 视图包含所有的用户信息的组件,如文本区域,按钮,滑块,被认为是表示层的一个iOS应用.

Webrtc的ios框架编译

1.WebRTC的iOS框架的选择 目前两个比较活跃的开源WebRTC实现. Google WebRTC: 项目地址是: https://code.google.com/p/webrtc/ Ericsson Research OpenWebRTC: 项目地址是: https://github.com/EricssonResearch/openwebrtc 我们戴维营教育为了给学生实战项目中运用WebRTC视频通话技术,选择Google的WebRTC项目来构建iOS App的开发框架,因为目前Ch

MVC MVVM Knockout 常遇问题总结

1.模板绑定(使用插件jquery.tmpl) var ViewModel={Product:ko.observable()} <div data-bind="template:{name:'templatePropertys'}"><div> <script type="text/html" id="templatePropertys"> {{each(i,item) Product().自定义属性集}} &