MVC 模式
作为iOS 开发者,我们都很熟悉MVC模式。根据苹果官方的解释
业界戏称Massive ViewController(臃肿的视图控制器)
因此当我们随着功能越来越丰富,ViewControlle往往变得臃肿和繁杂,而且模块模块之间相互耦合,难以维护,下图MVC模式
Controller 层
- ViewController 通过Target - Action,DataSource和Delegate 来接收用户的交互事件。
- 并通过Outlet 来更新View.
- ViewController 还通过Notification和KVO来接收来自Model的通知,并通过变量更新Model
- 还负责导航,网络访问,数据缓存,错误处理以及Model 对象的Encode和Decode
由于强耦合,对ViewController 的一点点改动都需要进行手工回归测试,费时费力,
MVVM 模式及其优点
MVVM 是目前解决ViewController臃肿问题的有效方法。
MVVM 由三层组成
Model层
用于保存数据的模型对象,通常定义为只有数据并没有方法的结构体(Struct)
View层
用于呈现UI(用户界面)并响应用户的事件通常是ViewController和View
ViwModel层
用于桥接Model和View两层,把Model转换成View呈现UI所需的数据,并把View层的用户输入更新到Model中。
MVVM 比MVC 的优势
- 能有效减少代码的复杂性,即MVVM模式能有效简化ViewController 的逻辑,使用ViewController 的代码只处理UI相关的逻辑。
- 能提高代码的可测性,由于ViwModel 明确负责Model与View之间数据转换,而且不负责View的生命周期管理,我们可以很方便的测试ViewModel的代码逻辑,提高代码的健壮性。
- 能够降低代码的耦合性,在MVVM模式下每一层都明确分工,这样可以减少代码的耦合性,提高代码的可维护性和可重用性。
基于MVVM的架构设计
View层
View由UIViewController以及UIView所组成,负责呈现UI和响应用户事件。
ViwModel层
她是核心,主要任务是链接View和Model层,
- 为View层准备呈现UI数据。
- 响应View层所提供的用户事件。
- 还负责处理路由和发送用户行为数据。
- 进一步细分各个模块,ViwModel/Routing/RepositoryTracking/Networking/DataStore
ViwModel是一个协助的角色,负责View层所需要的数据,并响应View层的用户事件,ViwModel与上一层的View由UIViewController之间通过响应式编程的方式来通知对方,而上一层UI组件通过数据绑定的方式,来监听ViewModel的数据变化及时更新UI。
Routing(跳转层)
是负责路由和导航的模块,ViewModel在响应View的请求时(如开发新页面),会调用Routing模块进行导航。
Tracking(埋点层)
负责统计分析数据模块,ViewModel 在响应View的请求时(如用户点击了点赞按钮),会调用Tracking 模块发送用户行为的数据
Repository(数据层)
数据层,维护着App所使用的Model数据。当ViwModel 需要访问数据的时候,会调用Repository模块,然后Repository会根据需要通过Networking 来访问网络后台的数据。或者调用DataStore来访问本地缓存的数据,
ViwModel与Repository 都是响应式编程的方式
ViwModel 给Repository 发起请求,并监听Repository 来获取数据的变化
Networking(网络层)
网络层发起网络请求,返回的JSON数据Decode成Model数据,Repository 与 Networking的接口也是响应式编程的方式。
Repository 会给Networking 发起请求,并监听Networking的返回。
DataStore(数据存储层)
数据存储层,用于把数据缓存到APP里面使用户在不需要等待网络请求的情况下可以快速看到UI,
Repository 与 DataStore 也是响应式编程方式
Repository 监听 DataStore 的数据变化
Model 层
存放一些数据模型的对象,这些对象能用于存放网络请求使用的数据,也可用于存放本地缓存的数据。
朋友圈模块的架构设计
有了上述的架构设计我就可以吧MVVM模式应用到各个业务模块中
下图类型关系图
View 层(显示朋友圈界面)
View 层用于显示UI,
- MomentsViewTimeLineViewController 用于显示朋友圈界面,这个界面里面使用了一个TableView 来显示各种不同的Cell,
- Cell 里面包含了UserProfileListItemView 用于显示用户的个人信息, MomentsListView 显示朋友圈的信息
ViewModl 层
MomentsTimeLineViewModl
ViewMoel 层由许多组件所组成,核心MomentsTimeLineViewModl,它为VC呈现UI数据,并处理用户的事件。
TrackingRepo
MomentsTimeLineViewModl 要发送统计分析数据的时候调用,进而把用户行为数据发送到分析数据后台
AppRouter
MomentsTimeLineViewModl 要导航到其他页面时调用AppRouter会调用路由模块导航到其他页面
MomentsRepoo
需要读取或更新数据的时候,会给MomentsRepoo 发起网络请求。
- Repoo 负责发送网络请求,并把朋友圈的数据缓存到本地文件系统中,
- Repoo 是所有朋友圈信息数据中心,App里面任何页面需要朋友圈信息的数据,都可以从 Repoo 读取
进一步解耦,数据缓存和网络请求模块从Repoo 中独立出来
DataStore
MomentsRepoo 需要写入缓存的时候调用DataStore负责把模型数据保存到UserDefaults
Networing
发起网络请求
GetMomentByuserIDSession
MomentsRepoo 需要从网路取出朋友圈信息时会调用GetMomentByuserIDSession,
1.GetMomentByuserIDSession 会从Repoo 读取朋友圈信息,当MomentsRepoo 需要更新朋友圈信息时(如更新点赞的状态),会调用.GetMomentByuserIDSession 对MomentsRepoo 里的Networing 发起网络请求
Model
总结
- MVVM 可以有效降低各个模块之间的耦合度,提高可重用性,
- 每个模块之间明确的责任与分工,我么在实现新功能时,也能够降低沟通成本,提高开发效率