zoukankan      html  css  js  c++  java
  • iOS MVVM架构

    iOS中,我们使用的大部分都是MVC架构虽然MVC的层次明确,但是由于功能日益的增加,代码的维护,更多的代码被写在了Controller中,这样Controller就显得非常臃肿。
    为了给Controller瘦身,后来又从MVC衍生出了一种新的架构模式MVVM架构

    MVVM分别指什么

    Model-数据层
    ViewController/View-展示层
    ViewModel- 数据模型

    MVVM与MVC的不同

    首先我们简化一下MVC的架构模式图:


    MVC.png


    在这里,Controller需要做太多得事情,表示逻辑、业务逻辑,所以代码量非常的大。而MVVM:


    MVVM.png

    比如我们有一个需求:一个页面,需要判断用户是否手动设置了用户名。如果设置了,正常显示用户名;如果没有设置,则显示“简书0122”这种格式。(虽然这些本应是服务器端判断的)
    我们看看MVC和MVVM两种架构都是怎么实现这个需求的

    MVC:

    Model类:

    #import <Foundation/Foundation.h>
    @interface User : NSObject
    @property (nonatomic, copy) NSString *userName;
    @property (nonatomic, assign) NSInteger userId;
    @end

    ViewController类:

    #import "HomeViewController.h"
    #import "User.h"
    @interface HomeViewController ()
    @property (nonatomic, strong) UILabel *lb_userName;
    @property (nonatomic, strong) User *user;
    @end
    
    @implementation HomeViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        if (_user.userName.length > 0) {
            _lb_userName.text = _user.userName;
        } else {
            _lb_userName.text = [NSString stringWithFormat:@"简书%ld", _user.userId];
        }
    }

    这里我们需要将表示逻辑也放在ViewController中。

    MVVM:

    Model类:

    #import <Foundation/Foundation.h>
    @interface User : NSObject
    @property (nonatomic, copy) NSString *userName;
    @property (nonatomic, assign) NSInteger userId;
    @end

    ViewModel类:
    声明:

    #import <Foundation/Foundation.h>
    #import "User.h"
    @interface UserViewModel : NSObject
    @property (nonatomic, strong) User *user;
    @property (nonatomic, copy) NSString *userName;
    
    - (instancetype)initWithUser:(User *)user;
    @end

    实现:

    #import "UserViewModel.h"
    
    @implementation UserViewModel
    
    - (instancetype)initWithUser:(User *)user {
        self = [super init];
        if (!self) return nil;
            _user = user;
        if (user.userName.length > 0) {
            _userName = user.userName;
        } else {
            _userName = [NSString stringWithFormat:@"简书%ld", _user.userId];
        }
            return self;
    }
    @end

    Controller类:

    #import "HomeViewController.h"
    #import "UserViewModel.h"
    
    @interface HomeViewController ()
    
    @property (nonatomic, strong) UILabel *lb_userName;
    @property (nonatomic, strong) UserViewModel *userViewModel;
    
    @end
    
    @implementation HomeViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
            _lb_userName.text = _userViewModel.userName;
    }

    可见,Controller中我们不需要再做多余的判断,那些表示逻辑我们已经移植到了ViewModel中,ViewController明显轻量了很多。

    总结:

    • MVVM同MVC一样,目的都是分离Model与View,但是它更好的将表示逻辑分离出来,减轻了Controller的负担;
    • ViewController中不要引入Model,引入了就难免会在Controller中对Model做处理;
  • 相关阅读:
    Quartz实现动态定时任务
    Springboot跨域和SpringCloud跨域
    java8 LocalDate 判断一年中的标准周末和工作日
    [WIP]iOS/macOS开发中常见的宏解释
    [WIP] Objective-C Runtime调试
    [WIP] iOS课程作业
    macOS 允许任何来源的应用
    Win10系统下移动、复制、删除文件需要管理员权限的解决方法
    flutter MediaQuery获取屏幕宽度高度密度通知栏高度等屏幕信息
    Flutter 获取状态栏高度、appBar高度 和 手机屏幕宽高
  • 原文地址:https://www.cnblogs.com/includeao/p/6425091.html
Copyright © 2011-2022 走看看