架构模式:为什么要选择MVVM模式?

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层,

  1. 为View层准备呈现UI数据。
  2. 响应View层所提供的用户事件。
  3. 还负责处理路由和发送用户行为数据。
  4. 进一步细分各个模块,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 发起网络请求。

  1. Repoo 负责发送网络请求,并把朋友圈的数据缓存到本地文件系统中,
  2. Repoo 是所有朋友圈信息数据中心,App里面任何页面需要朋友圈信息的数据,都可以从 Repoo 读取

进一步解耦,数据缓存和网络请求模块从Repoo 中独立出来

DataStore

MomentsRepoo 需要写入缓存的时候调用DataStore负责把模型数据保存到UserDefaults

Networing

发起网络请求

GetMomentByuserIDSession

MomentsRepoo 需要从网路取出朋友圈信息时会调用GetMomentByuserIDSession,

1.GetMomentByuserIDSession 会从Repoo 读取朋友圈信息,当MomentsRepoo 需要更新朋友圈信息时(如更新点赞的状态),会调用.GetMomentByuserIDSession 对MomentsRepoo 里的Networing 发起网络请求

Model

请添加图片描述

总结

  • MVVM 可以有效降低各个模块之间的耦合度,提高可重用性,
  • 每个模块之间明确的责任与分工,我么在实现新功能时,也能够降低沟通成本,提高开发效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值