您的位置:首页 > 其它

MVVM

2017-12-22 14:56 78 查看

MVVM

解决的问题:VC臃肿、遗失的网络逻辑(没有属于它的位置)、较差的可测试性等

优点:有维护性较强、耦合性很低的一种新架构



ViewModel: 视图模型。逻辑代码、网络请求等。是视图显示逻辑、验证逻辑、网络请求等代码存放的地方,唯一要注意的是,任何视图本身的引用都不应该放在VM中,换句话说就是VM中不要引入UIKit.h (对于image这个,也有人将其看做数据来处理,这就看个人想法了,并不影响整体的架构)。VM中包含了所有的展示逻辑而且不会引用V,

ReactiveCocoa

可以说是结合了函数式编程和响应式编程的框架,也可称其为函数响应式编程(FRP)框架,

RAC优点:提供了一个单一的、统一的方法去处理异步的行为,包括delegate方法,blocks回调,target-action机制,notifications和KVO.提供了一种新的与众不同的写代码的思维,由于RAC将Cocoa中KVO、UIKit event、delegate、selector等都增加了RAC支持,所以都不用去做很多跨函数的事。



1、Frameworks

存放系统库的虚拟文件夹, 目前搭建框架的时候需要手动添加一个名称为Frameworks的虚拟文件夹,这样你在Build Phases 中添加的系统库会自动归入此文件夹,不会直接在外部显示以至于打乱目录结构。系统库添加流程如下:



4、Class

工程主体类, 日常大部分开发代码均在这里,又细分了好多次级目录。

通用类

General : 通用类(文件夹项目移植过程中都不需要更改的就能直接使用的)

Base : 基类 (整个框架的基类)

Categories : 公共扩展类 (就是一些常用的类别,比如分享啊什么的)

Core : 公共核心类(一般存放个人信息、接口API等)

Models : 公共Model (公用的一些数据模型)

Views : 公共View (封装的一些常用的View)

工具类

Helpers : 工程的相关辅助类(比如类似数据请求、表单上传、网络监测等工具类)

宏定义类

Macro : 宏定义类 (就是整个应用会用到的宏定义)

AppMacro.h app项目的相关宏定义

NotificationMacro.h 通知相关的宏定义

VendorMacro.h 第三方相关宏定义

UtilsMacro.h 为简化代码的宏定义

…等等等等(其他随你定啦!Y^o^Y )

APP具体模块代码类

Sections : 各模块的文件夹(一般而言,我们以人为单位)

LSSections 王隆帅的文件夹

CLSections 马成麟的文件夹

…等等等等(也可以写你最喜欢的苍老师的,叼叼的!)

每个成员的文件夹下是其所负责模块的文件夹,比如苍老师负责PHP界面模块(我也认为PHP是最好的语言!大家可以在评论区谈论一下!๑乛◡乛๑ 磨人的小妖精),如下(接着上面的个人文件夹):

PHP : 模块名,也可以是首页(HomePage)…等等

ViewControllers 界面控制器存放处(这是文件夹名)

ViewModels 打杂的(MVVM的核心、解耦合、处理逻辑等)

Views 界面相关View存放处(界面相关子View)

Models 数据模型存放处(各种单纯的数据模型,一点都不胖,是标准的瘦Model)

这就是标准的MVVM了。。。为啥不和上面目录连起来呢?为啥呢?为啥呢?因为臣妾做不到啊!!!(不会三级、四级列表的MarkDown写法,求大神支招!良辰必有重谢!)

第三方类库

Vendors : 第三方的类库/SDK,如UMeng、WeiboSDK、WeixinSDK等等。

5、Resource

这里放置的是工程所需的一些资源,如下

Fonts 字体

Images 图片(当然你可以添加至Assets.xcassets, 没人拦着你)

Sounds 声音

Videos 视频

2、基类详解

这里着重讲解一下VC、V、VM的基类,其他的模式与View类似所以略过,其中TableViewCell的基类稍微特殊所以也提一下。



1、YDViewController





函数的具体用意图已经标的很清楚了,这里简单讲一下四个函数的作用

yd_addSubviews : 添加View到ViewController

yd_bindViewModel : 用来绑定V(VC)与VM

yd_layoutNavigation : 设置导航栏、分栏

yd_getNewData : 初次获取数据的时候调用(不是特别必要)

2、YDView





yd_setupViews : 添加子View到主View

yd_bindViewModel : 绑定V与VM

yd_addReturnKeyBoard : 设置点击空白键盘回收

3、YDViewModel





yc_initialize : 进行一些逻辑绑定,网络数据请求处理。

LSRefreshDataStatus 数据处理后需要进行的操作标识

LSHeaderRefresh_HasMoreData 下拉还有更多数据

LSHeaderRefresh_HasNoMoreData 下拉没有更多数据

LSFooterRefresh_HasMoreData 上拉还有更多数据

LSFooterRefresh_HasNoMoreData 上拉没有更多数据

LSRefreshError 刷新出错

LSRefreshUI 仅仅刷新UI布局

4、YDTableViewCell



由于Cell比较特殊,所以单拎出来说一下。观察上面的ViewMdoel、View等的基类会发现每个基类都会有数据绑定的地方,但是cell得数据绑定需要放在数据初始化的时候,因为所有的基类的数据逻辑绑定都是在没有返回初始化对象的时候调用的,但是cell中假如在那里面进行数据绑定会出现问题比如下图



上图中的函数假如是在 bindViewModel 内,则会复用失败,点击按钮是没有反应的,但是假如是在数据初始化的时候调用:比如 setViewModel 的时候,就会OK了,因为里面用到了cell的在RAC中复用机制 rac_prepareForReuseSignal ,在cell还没有初始化返回的时候是失效的。

3、题外话

基类的作用是统一管理,统一风格,便于编码,有更多的额外的附加功能的话,建议使用Protocol 或 Category,这样移植性强,便于管理与扩展,不至于牵一发而动全身。

本篇基类核心是用VM来配置V(VC),并提供一些必须的Protocol方法来处理界面显示、逻辑,将代码风格规范化,各个部分的功能明朗化,这样,
9c49
当你需要写什么,需要找什么,需要更改什么的时候都会很明确这些代码的位置,逻辑更清晰,而不会浪费更多的时间在思考应该写在哪,该去哪找,要改的地方在哪这种不该费时间的问题上。

三、实战部分(经典列表的实现)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvvm