UIViewController解耦---浅析Three20架构

前言

Three20是一款由Facebook开源的框架,由大神Joe Hewitt)建立,曾经风靡一时,被无数开发者观阅。Three20主要提供了UI模块、Network模块以及相关的一些工具。Three20自开源之初就褒贬不一,有人称赞它强大的UI工具,也有人在诟病Three20各个模块之间的耦合度过高,并且更多人在抱怨Three20极少的开发文档,我想这些大概也是Three20在苹果发布iOS6以后就中止了更新维护的缘由吧。大神Joe Hewitt)建立的在Github上的源码早已删除,目前只有少数人在GitHub上为本身的项目维护。而我也是有幸在某个项目中见识到了曾经耳闻,却未目击的Three20框架,所以才有了这篇文章。html

架构

最近你们都在讨论MVC、MVVM以及MVP三种在移动端开发中经常使用到的架构模式,到底是哪一种架构最强大,最适合移动开发者使用。这里笔者也阐述一下我的意见,有句方言叫“树挪死,人挪活”,我的认为,架构是死的,开发者是活的,咱们不须要局限于哪种架构的模式之下,看到你们都在用MVVM,因而花大成本将MVC架构模式的老项目重构成了MVVM架构,这种重构我的看来其实并无意义。更多的架构话题就不想在这里讨论了,笔者推荐几篇大神们关于架构的看法。ios

UIViewController瘦身

架构模式并非限制思惟,相反应该是发散思惟,咱们并不该该为了架构而架构,架构应该是服务于咱们的代码逻辑,打造更具备扩展性和健壮的代码结构。就好比,大多数开发者都会遇到一个一样的问题,随着项目一每天的壮大,功能愈来愈多,需求愈来愈多,而咱们的UIViewController也变得愈来愈臃肿。在上面推荐的博文中,笔者们都或多或少的阐述了如何打造更轻量级的UIViewController,大都列举了一些共性策略:架构

  • 将一个界面中的数据获取抽象成一个类,这里面细分一下,包括了网络请求和数据库缓存,咱们能够针对这俩点再次封装成俩个类。mvc

  • 将一个界面中的数据处理逻辑抽象成一个类,这里面包含了各类数据转换和算法逻辑,好比数据检索,数据遍历等。框架

  • 将一个界面中数据传递到UIView视图的过程抽象成一个模型类,这里面就包含了对应到UIView视图的每个数据的传递,好比icon图标,title标题,comment评论内容等。mvvm

  • 将一个界面中全部展现的UIView视图的添加和渲染抽象成一个类,这里包含了添加控件,自定义动画等。这个对视图的封装仍然能够细分,每个自定义控件均可以单独封装,由于这样能够完美的在其余的UIViewController达到复用的目的。

而完成了上述抽象以后,就会发现咱们须要在UIViewController中完成的工做仅仅是处理视图交互逻辑和数据传递逻辑,这样咱们的UIViewController就比较容易维护了。

Three20架构

每一种框架的兴起和衰落都有其相应的时势和必然性。虽然Three20饱受诟病,早已跌落神坛,可是它的存在是有必定道理的。虽然它在模块之间的耦合度较高,可是我的认为它对UIViewController的抽象和封装也是一个很是好的借鉴。在这里以Three20中对TTTableViewController的解耦为例,先上图看一下TTTableViewController包含的模块:

Three20中TTTableViewController解耦

这里根据上面的结构图具体地解释一下解耦的设计方式。TTTableViewController的设计听从了经典的MVC模式,TTModel负责数据的获取和处理逻辑,TTTableView负责视图展现,TTTableViewController负责TTModelTTTableView之间的通讯逻辑和界面的控件添加渲染。而TTTableViewController在顺应了MVC模式的前提下,也作了一些扩展,它将TTTableViewDatasource接收数据传递的逻辑抽象出来封装成了TTTableItem。而TTTableItem就是关联TTModel传递数据的过程,于是咱们也能够把这一层称做是MVVM架构模式中的ViewModel

根据上面的图示,咱们能够看到获取数据的逻辑都在TTModel中,并且界面控件添加和动画渲染这些逻辑仍然都在TTTableViewController中,所以我根据大神们的一些建议,对项目中的Three20进行了一下强化,先上图看一下增长的结构:

Three20结构强化

能够清晰地看到,我将TTModel中处理缓存数据的逻辑抽象出来,单独放在了TTCacheModel中,此外还将TTTableViewController中添加控件和渲染动画的逻辑抽象出来,放到了TTViewRender中,这样TTTableViewController就只关心界面交互以及TTModelTTTableItem之间的数据传递逻辑。

相关文章
相关标签/搜索