MVVM解析

Vue MVVM 原理深度解析 ✅ 定制特殊需求(如自定义指令)✅ 深入理解现代前端框架设计思想。✅ 更高效地使用响应式API。Diff对比旧VNode。✅ 精准定位性能瓶颈。 阅读详情

开篇

MVC Model-View-Controller是一个用来组织代码的权威范式。Apple甚至是这么说的。在MVC下,所有的对象被归类为一个model,一个view,或一个controller。Model持有数据,View显示与用户交互的界面,而View Controller调解Model和View之间的交互。 MVVM MVVM的出现主要是为了解决在开发过程中Controller越来越庞大的问题,变得难以维护,所以MVVM把数据加工的任务从Controller中解放了出来,使得Controller只需要专注于数据调配的工作,ViewModel则去负责数据加工并通过通知机制让View响应ViewModel的改变。



1.Model模块

首先是model层的代码,创建MovieModel类,继承自NSObject。设置几个属性movieName、year、imageUrl、detailUrl(用于跳转)

#import <Foundation>

@interface MovieModel : NSObject
@property (strong, nonatomic) NSString *movieName;
@property (strong, nonatomic) NSString *year;
@property (strong, nonatomic) NSURL *imageUrl;
@property (strong, nonatomic) NSString *detailUrl;
@end
ViewController模块

ViewController里面是用来从MovieViewModel中获取数据信息然后展示到UITableView的cell上面,和点击单元格的页面跳转

#import "HomeViewController.h"
#import "MovieViewModel.h"
#import "MovieCell.h"
@interface HomeViewController ()<UITableViewDataSource>

@property (nonatomic,strong) NSArray *modelArray;
@end

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"电影首页";
    self.view.backgroundColor = [UIColor redColor];

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    tableView.dataSource = self;
    tableView.delegate = self;
    tableView.rowHeight = 80;
    [self.view addSubview:tableView];
    [tableView registerClass:[MovieCell class] forCellReuseIdentifier:@"MovieCell"];

    //初始化MovieViewModel,设置成功(returnBlock)和失败的回调(errorBlock),getMovieData去请求数据,请求数据成功即回调上一步设置的returnBlock,请求失败则回调errorBlock
    MovieViewModel *viewModel = [[MovieViewModel alloc] init];
    viewModel.returnBlock = ^(id returnValue){

        _modelArray = returnValue;
        [tableView reloadData];
    };
    viewModel.errorBlock = ^(id errorCode){

        NSLog(@"%@",errorCode);
    };

    [viewModel getMovieData];

}

#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _modelArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    MovieCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MovieCell"];
    cell.model = _modelArray[indexPath.row];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    MovieViewModel *movieViewModel = [[MovieViewModel alloc] init];
    [movieViewModel movieDetailWithPublicModel:_modelArray[indexPath.row] WithViewController:self];
}

@end
View模块

view这里跟MVC中子类化UITableViewCell一样,将model数据传进来,复写setModel方法给视图传递数据

#import "MovieModel.h"
@interface MovieCell : UITableViewCell
@property (nonatomic,strong) MovieModel *model;
@end

#import "MovieCell.h"
#import "UIImageView+AFNetworking.h"
@interface MovieCell()
@property (nonatomic,strong) UILabel *nameLabel;
@property (nonatomic,strong) UILabel *yearLabel;
@property (nonatomic,strong) UIImageView *imgView;
@end
@implementation MovieCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _imgView = [[UIImageView alloc] initWithFrame:CGRectMake(15, 10, 40, 60)];
        [self.contentView addSubview:_imgView];

        _nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 200, 20)];
        [self.contentView addSubview:_nameLabel];

        _yearLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 50, 100, 20)];
        _yearLabel.textColor = [UIColor lightGrayColor];
        _yearLabel.font = [UIFont systemFontOfSize:14];
        [self.contentView addSubview:_yearLabel];
    }
    return self;
}

- (void)setModel:(MovieModel *)model{
    _model = model;
    _nameLabel.text = _model.movieName;
    _yearLabel.text = _model.year;
    [_imgView setImageWithURL:_model.imageUrl];
}

@end
ViewModel模块

ViewModel是最重要的模块: 1.这里面进行了数据的网络请求,并将数据转换成model放在一个数组中,调用_returnBlock将model数组传递给viewController进行数据源的处理 2.将页面跳转的逻辑放在ViewModel中,点击单元格进行页面跳转的时候直接在- (void)tableView:(UITableView )tableView didSelectRowAtIndexPath:(NSIndexPath )indexPath中调用MovieViewModel的该方法即可

#import <Foundation>
#import "MovieModel.h"
#import <UIKit>

typedef void (^ReturnValueBlock) (id returnValue);
typedef void (^ErrorCodeBlock) (id errorCode);

@interface MovieViewModel : NSObject
@property (nonatomic,copy) ReturnValueBlock returnBlock;
@property (nonatomic,copy) ErrorCodeBlock errorBlock;

//获取电影数据
- (void)getMovieData;
//跳转到电影详情页
- (void)movieDetailWithPublicModel: (MovieModel *)movieModel WithViewController: (UIViewController *)superController;
@end

#import "MovieViewModel.h"
#import "NetworkService.h"
#import "MovieModel.h"
#import "MovieViewController.h"

@implementation MovieViewModel

- (void)getMovieData{
    [NetworkService requestWithURL:@"/v2/movie/coming_soon" params:nil success:^(id result) {
        NSLog(@"%@",result);

        NSArray *subjects = result[@"subjects"];
        NSMutableArray *modelArr = [NSMutableArray arrayWithCapacity:subjects.count];
        for (NSDictionary *subject in subjects) {
            MovieModel *model = [[MovieModel alloc] init];
            model.movieName = subject[@"title"];
            model.year = subject[@"year"];
            NSString *urlStr = subject[@"images"][@"medium"];
            model.imageUrl = [NSURL URLWithString:urlStr];
            model.detailUrl = subject[@"alt"];
            [modelArr addObject:model];
        }
        _returnBlock(modelArr);

    } failure:^(NSError *error) {
         NSLog(@"%@",error);
        _errorBlock(error);
    }];
}

- (void)movieDetailWithPublicModel: (MovieModel *)movieModel WithViewController: (UIViewController *)superController{
    MovieViewController *movieVC = [[MovieViewController alloc] init];
    movieVC.url = movieModel.detailUrl;
    [superController.navigationController pushViewController:movieVC animated:YES];
}
@end
Android MVVM架构解析 *LiveData:**是一种可观察的数据持有者类,抽象类无法被实现。它可以通过添加addSource(LiveData,Observer)方法,在内部存储多个LiveData数据,这些数据成为中介动态数据中的。(虽然这篇博客记录的是一些基础的知识点,但还是默认阅读这篇笔记的读者已经具备一定的安卓基础了,所以关于安卓工程的创建和运行在这里不再赘述。对于之前的布局文件.xml,可以将鼠标放在根布局的ViewGroup里面,使用快捷键。下面的代码中简单示例一下数据是如何和layout中的组件联动的。 阅读详情

相关推荐

WPF之MVVM解析

我们前面一节白话白眼,都只是从概念上了解了mvvm,了解和做还是差距很大,所以我们同样需要亲自动手实验来真的弄懂mvvm。        例子就取一个生活中的,用mvvm模式完成家庭的操作,比如显示查询家庭成员,增加家庭成员(娶妻生子等),减少家庭成员(嫁女老去等).        确定好这个例子我们就需要先准备一下数据,我们首先想到可能是用数据库,不过silverlight是浏览器客户端的东

星火燎猿 1万+

MVVM框架介绍

1,到底有哪些开源MVVM框架?   前面介绍了WPF的基本概念和一些相关知识,我们了解到开发WPF应用程序可以使用现成的框架和模式,最为合适的莫过于时下正热的MVVM模式,所以这里我们也列出针对MVVM模式的已有开源框架:                                              图3   上面除了WPFToolKit

兴趣是最好的老师 1万+

基于Swift的MVVM架构示例项目深入解析

一个基本的Swift iOS项目结构大致如下::项目文件,包含了项目的配置信息。:应用代理文件,处理应用级别的事件,如应用启动。或(对于iOS 13及以上版本):用于定义用户界面布局。:资源文件夹,存放图片、字体等资源。Info.plist:项目配置文件,定义应用的设置和属性。ModelsViewsViewModels文件夹:用于存放对应模块的代码文件。在MVVM架构中,我们会添加ViewModels。

weixin_42607969的博客 1127

mysql wpf mvvm_浅谈WPF中的MVVM框架--MVVMFoundation

先科普一下:什么是WPF,请看下图微软对于WPF技术的构想是很宏大的,可惜普及率不高,不过如果你要做Windows客户端开发的话WPF技术还是值得一学的。什么是MVVM模式#简单来说它是一种高级的UI设计模式。据我所知目前还运用在一些js框架中,比如AngularJS。其他的UI设计模式还包括MVC、MVP,个人觉得最强大的还是MVVM。MVVM主体框架如下图:The Model is the e...

weixin_39606638的博客 244

Unity-MVVM:适用于Unity3D的轻量级MVVM框架

Unity-MVVM 适用于Unity3D的简单轻量级MVVM框架 有关MVVM的背景信息,请查看 这个项目的目标是实现我在开发WPF应用程序时了解和喜爱的一些概念,主要是它们构建起来非常快捷,并且易于维护。 它还尝试解决我在过去几年中使用Unity时发现的一些特定于Unity的痛点。 添加到项目 该项目现在支持Unity的包管理器! 获取Unity-MVVM +样本并保持最新状态的最简单方法是将其添加到“程序包管理器”窗口中。 点击左上角的+图标,然后选择“从git网址添加”。 然后复制并粘贴此仓库中的https url,并确保添加#upm以获得正确的分支: : 该库将自动添加到您的项目中,并且您可以从程序包管理器下载示例以查看演示的用法。 文献资料 贡献 我愿意接受捐款,要求,PR等。但是,我知道这主要是一个个人项目,供我在,所以我不能保证会接受更改。 如果您想聊天,请在上

Unity-Weld:用于Unity的MVVM风格的数据绑定系统

团结焊 的Unity数据绑定系统。 Unity-Weld是Unity 5+的库,可在Unity UI小部件和游戏/业务逻辑代码之间进行双向数据绑定。 这减少了样板代码,否则这些样板代码对于属性更改时更新UI来说是必需的,从而消除了场景中对象之间容易被破坏的混乱链接的需求,并通过提供一层来简化代码的单元测试UI和您的核心逻辑代码之间的抽象关系。 关于Unity Weld的一系列文章已发表在。 可以在这里找到示例Unity项目: : 。 安装 要在新的或现有的Unity项目中安装Unity-Weld: 在Visual Studio中加载Unity-Weld.sln并进行构建 将Uni

MVVM架构简单使用

http://blog.cocoachina.com/article/34636#st-1 项目github地址 https://github.com/zhangjiahuan8888/mvvmDemo/tree/master 开篇 MVC Model-View-Controller是一个用来组织代码的权威范式。Apple甚至是这么说的。在MVC下,所有的对象被归类为一个mo

wangcuixin的专栏 699

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 326

Unity中的MVC、MVP、MVVE框架

本文结合一个小案例,讲解MVC、MVP和MVVE在Unity中的相关应用MVC思想最初来自网页和软件开发,并不是为了游戏开发而生,在游戏开发中主要用在大型商业游戏中,小项目使用反而会带来更多麻烦,请酌情使用。

qq_54476817的博客 6347

ubuntu安装FSL

1.下载fslinstaller.py 官网下载地址:https://fsl.fmrib.ox.ac.uk/fsldownloads_registration 或者去我的百度网盘取: 链接:https://pan.baidu.com/s/1d5eHm48oamFdYdKm84nifw 提取码:6ff9 2.将base环境改成python2.0版本 本来想在服务器安装,服务器没有sudo权限,网上很多教程都装不了,于是就自己安装虚拟机再装了一个ubuntu,然后安装了python2环境,再开始装fsl,fsl

qq_36421001的博客 4098

STK12与Python联合仿真(一):环境搭建

STK仿真python接口,安装与测试

qq_42635142的博客 1万+

Unity3D基础UI框架,Unity MVVM

unity ui框架 游戏框架

Soso 2万+

CAN信号定义避坑指南:Kvaser Database Editor里Byteorder和Bitpos设置的那些‘坑’

本文详细解析了在Kvaser Database Editor中配置CAN信号时,字节序(Byteorder)和起始位(Bitpos)设置的常见错误及解决方案。通过实际案例和验证技巧,帮助工程师避免DBC文件配置中的陷阱,确保车载电子系统的稳定通信。

weixin_28678831的博客 360

什么是MVVM?详细解析

什么是MVVM?详细解析 关系如图 MVVM对应VUE代码部分, <!DOCTYPE html> <!-- 输入 ! 再按键 回车就可以生成HTML文件模板 --> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> .

weixin_41290863的博客 945

天龙八部源码深度解析:从宠物系统到副本机制(C++游戏开发实战)

本文深度解析《天龙八部》源码架构,重点剖析宠物系统状态机实现与副本动态加载机制等核心模块。通过C++代码示例展示宠物AI状态迁移逻辑和副本场景管理技术,为现代游戏开发提供兼容性改造方案与设计启示。适合游戏开发者学习经典MMORPG的工程化实现路径。

weixin_29011239的博客 386

图解B+树的插入过程

B+ 树在现代数据库中很常见,如果我们了解它,在工作中可能对性能优化会有更好的帮助! 最近我一直在思考 B+ 树的高度是由什么决定的。知道我了解了 B+ 树的插入过程,才有一种恍然大悟的感觉! 网上的一些资料杂乱无章,不同的数据库可能还有对 B+ 树有不同的实现。但是万变不离其宗,B+ 树的定义,大致如下所示: 总结一下,B+ 树有下面 5 个重要的特点。 B+ 树包含 2 种类型的结点: 内部结点(也称索引结点)和叶子结点。 根结点本身即可以是内部结点,也可以是叶子结点。 根结点的关键字个数最

愿君出走半生,归来时仍是少年 2133

深入解析MVVM架构

mvvm 前言 我想做Android开发的大佬都用过MVP,在谷歌没有提出MVVM这种架构模式的时候,大多数开发者都是从传统的MVC过度到MVP的,的确MVP相对MVC来说的确有了很大的改进,具体改进了什么,下面我会一一比对说明,但是随着项目业务逻辑的复杂化,你会发现MVP其实也是非常难以维护,开发成本也是越来越高的,P层庞大的code会随着业务的一点点的增多而变得非常臃肿,庞大。后来,Google 为 Android 又开了一扇窗在Android中引入了MVVM这种设计。MVVM是谷歌提出的一种 A.

hirezy 8652

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 330

MVVM 架构解析及 Jetpack 架构组件的使用

谈到 MVVM 架构,不得不祭出官方的架构图,如下所示: 在实践中,根据对架构组件 paging 的使用和理解,笔者又将架构图扩展成下面这样: .png 有背景颜色的3处是使用 paging 组件需要多用到的 MVVM 和 MVP 的区别 MVP 中 V 层和 P 层互相持有对方的引用,在V 层调用 P 层逻辑后,P 层回调V 层的相应方法更新 UI。 而在 MVVM 中,上层只依赖直接下层,...

binaryshao 1万+

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值)【含Matlab源码 4887期】

斑马算法优化变分模态分解ZOA-VMD数字信号去噪(优化K值 alpha值) 完整的代码,包运行;运行操作视频见优快云资源!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 810

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

自己实现MVVM(Vue源码解析)

前言本文会带大家手动实现一个双向绑定过程(仅仅涵盖一些简单的指令解析,如:v-text,v-model,插值),当然借鉴的是Vue1的源码,相信大家在阅读完本文后对Vue1会有一个更好的理解,源代码放到了github,由于本人水平有限,理解不到位的地方还请大家指出。MVVMMVVM使开发可以更加关注于数据,减少了很大的工作量,也使代码可读性,可维护性更高,MVVM核心的思想就是视图是状态的函数:Vi

zp1996323的博客 3729

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MVVM源码解析之模板解析篇

源码解析之模板解析解析表达式解析普通指令 解析表达式 解析步骤: 从文本节点中取出表达式 从data中取出表达式对应的属性值 将属性值设置为文本节点的textContent const vm = new MVVM({ el: "#app", data: { name: "aa" } }); 在源码中,判断当前节点是否存在{{}},从而进行解析。 通过正则进行匹配大括号表达式,匹配成功后,判断当前元素是否包含文本节点

李耀书 452

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

对Vue中的MVVM原理解析和实现

对Vue中的MVVM原理解析和实现 首先你对Vue需要有一定的了解,知道MVVM。这样才能更有助于你顺利的完成下面原理的阅读学习和编写 下面由我阿巴阿巴的详细走一遍Vue中MVVM原理的实现,这篇文章大家可以学习到: 1.Vue数据双向绑定核心代码模块以及实现原理 2.订阅者-发布者模式是如何做到让数据驱动视图、视图驱动数据再驱动视图 3.如何对元素节点上的指令进行解析并且关联订阅者实现视图更新 1、思路整理 实现的流程图: 我们要实现一个类MVVM简单版本的Vue框架,就需要实现一下几点: 1、实

小羽羽博客 1369

MVVM的源码解析

function MVVM(options) { //给实例新增一个$options属性,.并且把传递过来的配置进行暂存 this.$options = options; this.$options.beforeCreate && this.$options.beforeCreate(); //在实例上新增一个_data 保存传递过来的data数据 var data = this._data = this.$options.data; /

飞仔的思维空间 154

Android中mvvm解析

Android中mvvm解析

Mr Ren 279

MVVM源码解析

简易vue.js框架(MVVM)源码解析 学习准备 [].slice.call() node.nodeType 节点类型 Objcet.defineproperty Object.hasOwnProperty DocumentFragment DocumentFragment 不是真实 DOM 树的一部分,它的变化不会触发 DOM 树的重新渲染,且不会导致性能等问题。const ul = doucment.getElementById('xxx') // 创建一个fragment const fragm

mengweizhao的博客 541
上一篇: tableViewCell中添加webView,cell自适应webView高度,解决死循环的简单办法
下一篇: tableView的性能优化
网上的虫
博客等级 码龄11年 8粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值