T 利用CoreData特性简化MVVM项目架构 - CocoaChina_让移动开发更简单

首页 >iOS开发

利用CoreData特性简化MVVM项目架构

2017-06-19 11:24 编辑: 枣泥布丁 分类:iOS开发 来源:沈凯的博客

MVVM设计模式的普及已经有一段时间了,关于MVVM的各种帖子在网上也是一搜一大把,所以如果你还不知道什么是MVVM,或者对于MVVM的实现还不太清楚,那么我建议你先去了解一下MVVM这个设计模式再继续阅读本文。

先来说说今天要使用到的CoreData——Uniquing,Uniquing本来是辅助faulting的机制,它保证了在一个managed object context中只有一个managed object来表达一条记录(不了解的同学可以查看这篇文章《iOS CoreData详解(四)Faulting and Uniquing》).而今天我们正是要利用这个机制来简化MVVM架构项目的搭建。

我们现在来假设一个场景,有两个页面,分别是主页面MainView和用户管理页面UserManagerView连个页面,这两个页面分别有MainViewModel和UserManagerViewModel,这两个viewmodle都从UserModel这个数据模型中获取或修改了userName属性,现在我们要求在UserManagerView中修改用户名之后,不需要调用任何代码,新的用户名就会出现在MainView上。

传统的架构模式是这样的:

1.png

在这种模式下,我们发现要做到不调用任何代码不行的,需要实现一个从数据模型(UserModel)到数据(Data)的实时映射,如下图:

2.png

而大部分的开发者是不会去实现这个实时映射机制的,所以在常见的开发中,我们会通过代理Delegate或者全局NSNotification通知的形式让每一个UserModel去改变它的值,但是很明显这样做的效率是很低的,而且当有较多页面,并且每个页面的View都引用了很多Model以后,这种实现方式会相当消耗系统资源。但是CoreData的Uniquing属性给了我们另一种可能:

3.png

从图中我们可以看到由于在同一个managed object context中只有一个managed object来表达一条记录,所以不管用什么样的方式去查询这个UserModel对象,只要用户ID相同,CoreData的Uniquing属性就能保证LoginViewMolde和UserManagerView获取的是同一对象,这样我们通过RAC将两个ViewModel和UserModel绑定起来就得到了我们想要的结果:

4.png

最后要强调一点,那就是一定要保证所有相关联的CoreData Model都是从同一个managed object context中fetch得到的,只有保证了这点,才能保证所有ViewModel获得数据的一致性和实时性。

最后的最后,附上代码:SimpleMVVMDemo

博客地址:https://skyshen.cn/

搜索CocoaChina微信公众号:CocoaChina
微信扫一扫
订阅每日移动开发及APP推广热点资讯
公众号:
CocoaChina
我要投稿   收藏文章
上一篇:iOS-调戏CoreML-这是花瓶?
下一篇:使用Xcode进行iOS设备无线调试
我来说两句
发表评论
您还没有登录!请登录注册
所有评论(0

综合评论

相关帖子

sina weixin mail 回到顶部