iOS MVC-MVVM再学习(设计模式,组织代码的权威范式)

本文详细介绍了iOS应用开发中MVVM模式的运用,通过一个具体的实例展示了如何在控制器中利用viewModel加载和处理数据,然后传递给视图进行展示。讲解了viewModel如何将网络请求的数据转换为适合视图展示的格式,并且提到了简单的界面适合MVC模式,复杂界面则采用MVVM模式以减少控制器的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0.个人总结

  • 输入(数据) 处理 输出(展示)
  • 如果处理部分很简单就用 mvc
  • 如果比较复杂就在分出一个 viewModel层,要控制器里面的代码变少一点,控制器就被划到View层里去了
  • iOS的控制器就是MVC模式,swiftUI用的是MVVM模式
  • 有些人按业务逻辑来进行大的分类,如图1
  • 有些按设计模式进行大的分类,如图2
  • 我倾向于按业务逻辑来进行大的分类,苹果系统应该也是这样设计的,就像下面的参考博客里斯坦福大学教授讲的,一个控制器就是一个MVC,如果比较复杂的控制器就用MVVM模式
    简单的界面用MVC模式,复杂的用MVVM模式
  • 图1
    请添加图片描述
  • 图2
    请添加图片描述

1.MVVM实例解析

  • viewModel对model进行了加工,个View更贴近,更适合view展示
  • 用户进入界面后,控制器找viewModel层要数据,viewModel发起网络请求(蓝牙,wifi,本地),要到数据后将json数据转成model,又将model转成viewModel,方便控制器显示

1.1 viewModel.loadData:控制器中有viewModel属性

class WBHomeController: WBRootController {
    /// viewModel
    lazy var viewModel = WBStatusListViewModel()

请添加图片描述

1.2 WBStatusListViewModel类中loadData方法的实现,将[WBStatusModel]转成[WBStatusViewModel]存在属性dataSourceArr中

请添加图片描述

1.3 WBNetworkTool.shared.requestStatus网络请求方法的实现,返回模型数组[WBStatusModel]

请添加图片描述

1.4 viewModel.loadData方法产生回调后tableView.reloadData()

// MARK: - 重写父类的数据源和代理方法
extension WBHomeController {
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewModel.dataSourceArr.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //判断使用哪一种cell
        let statuViewModel:WBStatusViewModel = viewModel.dataSourceArr[indexPath.row]

请添加图片描述

1.5 cell.statusViewModel = statuViewModel

请添加图片描述
请添加图片描述

下面的博客中有相关类的完整代码

ios swift MVVM实例(Model-View-ViewModel)

2.viewModel处理model后给到view举例

  • 计算行高

  • 时间展示

  • 处理VIP图标

/// 处理vip图标
    func dealWithVipImage() {
        if let verify_type = statusModel.user?.verified_type {
            switch verify_type {
            case 0:
                //达人
                vipImage = UIImage(named: "avatar_vip")
            case 2, 3, 5:
            //企业达人
                vipImage = UIImage(named: "avatar_enterprise_vip")
            case 220:
            //草根达人
                vipImage = UIImage(named: "avatar_grassroot")
            default:
                vipImage = nil
            }
        }
    }

参考博客

ios MVC架构(设计模式)和MVVM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值