项目MVVM的实际应用

 我来答
科创17
2022-07-02 · TA获得超过5862个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:169万
展开全部
MVVM是一种常见的设计模式,但是在工作中,我最常用的还是MVC的设计模式,MVVM只是在别人的文章中了解过,这一次正好公司项目中MVVM的设计模式,正好拿来分析一波。另外,项目并非全部是MVVM,而是和MVC设计模式掺和在一起的。当然,这并不矛盾。好了,我们就来结合实际项目来分析下MVVM的实现方式吧。

凡事趁热打铁,过了那个热乎劲想要再重新回到那个状态,难免会付出更多的时间和精力,所以还是少做傻事为妙。

1、VM页面怎么监控数据的变化?
2、Controller页面数据的变化怎么让VM随着数据的变化作出相应的调整呢?
3、因为VM是多个界面公用的,那么VM怎么判断不同页面的请求呢?
那就让我们来根据这几个疑问来分析吧。

用到的技术就是KVO。
1、首先我们在CourseVM.h类中,添加一个记录当前页面的属性。
@property (assign, nonatomic) int curPageNo;
KVO使用这个参数对数据进行监控,一旦刷新完毕,coursLoadOver的布尔值发证改变,触发KVO监控,然后调用代理,最终加载数据完毕。 也就是说,UI界面只管进行UI的处理,VM页面实时通过UI界面的值的改变监控数据的变化,然后再重新返回给UI界面,进行数据的刷新。
2、设置监控

1、监控、网络请求、传值的思想
VM中设置监控的参数,VC中给初始值,然后触发监控,调用网络请求,请求完毕之后,重新赋值数据的Array,用于VC的刷新重载数据,另外一个监控参数bool发生改变,调用代理,将数据传递出去。 [self.currentTable reloadData];重新刷新tableView.
这样的好处是,在VC页面完全没有网络的请求数据的处理,只是专注于界面数据的加载。

2、网络监听的注意点:
多次下拉刷新,每次都要删除一下bool的监听,然后再重新设置监听,这么做的原因就是每次监听相当于重新监听,这样的话就避免了每次的bool值都是一样的到时监听失效,无法调用代理的问题哦。完美

自己在重写的时候发现一个问题,那就是设置了KVO监听之后,在第一次加载的时候,用于传递数据的block和delegate都失效了,百思不得其解。然后经过请教邓晓文同学之后,发现原来是我的KVO监控的位置太提前了。
...
注意,只是在第一次的时候block和代理无法传递至,如果再次改变curPageNo的值,此时的block和代理都能将数据传递出来,思考下到底是什么原因呢?
...

...
究其原因就是:监听提前了,导致代理和block都还没有来得及设置,所以第一次初始化的时候我们可以监听到变量的改变,但是代理和block根本就来不及触发,导致数据无法传递出来。我们要做的就是在设置代理和block之后再添加监听才是正确的。like this:
...

代理方法:
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式