第一章 更轻量的 ViewControllers

一、更轻量的ViewControllers 

1、把Data Source和其他的Protocol分离出来

比如说UITableView初始化的Data Source可以分离到ArrayDataSource。不过个人认为这种处理方式会无形中多出较多的文件,每个TableView都需要初始化数据,如果说把他们集成在一个文件里面通过table类型处理的话,又可能代码阅读和调试障碍。

在demo中并没有提及和实现数据变化后tableView的刷新问题,这也是一个障碍。

所以我个人不倾向这种处理,考虑下次开发时处理下,在建立文件目录使用MVVM的架构时,每个ViewController对应一个ArrayDataSource结构倒是清晰,需要文件过多的问题。

2、把业务逻辑移植到Model中处理

这里是指的对Model中的数据做一些逻辑处理,比如说日期格式,这一点还是很赞成的,特别的是指处使用Category的形式实现逻辑处理的方法。

因为在大多数时候,我们想提取的方法又可能是会重复在其他的Model中也需要的,这样就可以省去重复代码。

3、创建 Store 类

这里我个人的理解,Store还是有一定必要的,并且像这样读取并处理数据的功能,在大部分App中是真实存在的需求。它其实还是很像一个Model,只是这个Model自己实现了requestData的功能,在当前流行的几种App架构设计中,是有使用Model自获取数据的先例的;即使不是自获取,也会新建一个功能类去获取数据,都是为了减少在ViewController中添加这些代码。

4、把网络请求逻辑移到 Model 层

对于将网络请求的基本实现从ViewController中剥离这一点,我很赞同,这也是当前的主流思想。具体的实现方式,其实放在Model中是一个很好的选择。

可以使得代码的阅读更加简明,因为需要用到Model的时候,就能看到数据的获取,可以极大的简化ViewController的代码量。

5、把 View 代码移到 View 层

当我们需要实现一个复杂的View,比如说顶部滚动的banner,我们只需要在ViewController中初始化就能直接使用,这是一件很美妙的事,其实UITableView就是最好的例子。

二、整洁的TableView代码

1、UITableViewController vs. UIViewController、Table View Controllers 的特性、Table View Controllers 的限制

我把这三个放在一起是有原因的,我们可以分析一下,工程师在开发中发现App中有大量的Table需求为了简化这些实现就有了UITableView,由于iOS开发的界面基础就是ViewController,就有了UITableViewController。

可以说它的形成原因决定了它的特性和限制,只为Table而生。

2、使用 Child View Controllers

当我们的界面有Table也有其他的控件,并且Table的样式丰富、功能复杂,更有甚者它其实是一个独立的功能界面,被引用到这个ViewController了。

有了这些需求就有了addChildViewController这个方法,唐巧大大的博文中有这段话说明了问题:

苹果新的 API 增加了 addChildViewController 方法,并且希望我们在使用 addSubview 时,同时调用 [self addChildViewController:child] 方法将 sub view 对应的 viewController 也加到当前 ViewController 的管理中。对于那些当前暂时不需要显示的 subview,只通过 addChildViewController 把 subViewController 加进去。需要显示时再调用 transitionFromViewController:toViewController:duration:options:animations:completion 方法。

另外,当收到系统的 Memory Warning 的时候,系统也会自动把当前没有显示的 subview unload 掉,以节省内存。

3、搭建 Model 对象和 Cells 之间的桥梁

这里我理解的就是ViewModel的概念了,建立Cell Category确实是一个在一般情况下非常好的选择。这种处理方式可以使得Cell非常容易的处理多种Model数据,并且代码的耦合处理的很好。

我个人认为在App开发的时候,项目没有严格按照MVVM的形式搭建的情况下,使用这种Category的方式,十分可行。

4、让 Cells 可复用

和上条一样,即实现Category的时候,多种不同的Protocol可以用来处理不同的Model,实现了复用。

5、在 Cell 内部控制 Cell 的状态

其实就是Cell自行处理内部逻辑实现,外部最多只通过一个变量的设置、或一个方法入口调用。例如设置Cell高亮时的Cell其他控件状态,外部可以通过设置Highlight属性,完成内部设置。

6、控制多个 Cell 类型

一个TableView中多种Cell类型的处理,比较常见,就是在CellForRowAtIndexPath中根据数据源或者IndexPath来区分加载,分离的方法一般就是一个Cell一个方法调用。

7、编辑 Table View

其实说的就是在使用Model的情况下,ViewController只是负责实现编辑TableVIew的UI操作,得到反馈后通知Model去对数据进行增删改排序操作。

三、View Controller 容器

感觉就是讲述addChildViewController和普通的单纯执行addSubView的区别,前者是一套完整的ViewController处理逻辑,后者只是一个View。

你可能感兴趣的:(第一章 更轻量的 ViewControllers)