iOS A与B界面 model 的传值

iOS A与B界面 model 的传值,第1张

场景:两个界面A,B(A跳转B界面)同时需要引用同一个model,并修改

问题是:在B中如果直接用一个同类型model的属性来接受A界面传过来的Model时,在B界面修改model后,A界面对应的model也会发生变化

要求:A,B对相同数据的model,进行引用修改彼此不影响

解决思路:利用第三方MJExtension的模型转字典,再用字典转成模型,传值给B,就OK了。(多层嵌套模型也OK)

就是这个了,一个强类型的model,这个model只能设置一个。
这个应该是微软给的那个MUSIC STORE项目吧,这个view是在控制器,点击右键,添加视图,添加强类型视图,做出来的。
基本的 *** 作应该是在对应的Control里面写上
ViewModel = 一个model的对象。
这样model就能点出来,也能遍肠耽斑甘职仿办湿暴溅历出来了。
要理解这个得先清楚MVC的机制,还有微软的MVC3的机制 ,这个我猜LZ一定明白的。如果不明白还要查查资料。

主要目的是为了记录

NSArray trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData: [NSKeyedArchiver archivedDataWithRootObject:@[dataModel]]];

所得的数组以及数组内的model都是深copy。

NSMutableArray array = [NSMutableArray arrayWithArray:@[model,model1]];
NSArray lastArray = [[NSArray alloc]initWithArray:array copyItems:YES];
所得的数组以及数组内的model都是深copy。

到此就实现了对model的直接copy,不管model里面是否含有包含其他model的数组。拷贝后,都能得到一个全新的model。

  首先,如果你遇到修改数组里面的其中一个模型导致所有的模型改变了这个问题,先不管别的,你先打印下你的数组里面的模型看是否同一个,不出意外,应该和下面的一样:
  完成了这些 *** 作后,现在就开始 copy 了,如果我们有一个model1的实例,然后调用以下方法

  这样我们就成功的用上面copyWithZone的方法创建一个model1的副本,然后赋值给了model2,再添加至数组,经过这样 *** 作,你再打印下数组里面的模型,不出意外,变成了:

  可以看出,和之前对比,模型地址不同了,这下你再试下修改一个一个模型的值,其它模型的值就不会跟着变了!!!

​ iOS源码解析—YYModel(YYClassInfo) 分析了如何根据OC的Class对象构建YYClassInfo对象,为接下来的JSON数据和Model转换作准备,这篇文章开始讲解NSObject+YYModel。

​ 分析NSObject+YYModelh文件,包括3个Category和一个protocol,分别是:

字典studentDic中的key对应原字典playerDic中的key,studentDic中的Model由playerDic中的value转化得到。

首先定义了两个类,_YYModelMeta和_YYModelPropertyMeta,分别封装了Model的信息和Model中各属性的信息。

_YYModelMeta维护了Class的相关信息,下面是注释:

_YYModelMeta是通过YYClassInfo对象的信息构建得到的。首先调用metaWithClass:cls方法,该方法如下:

维护了一个键值对cache作为缓存,用cls作为key,调用CFDictionaryGetValue方法去缓存中查找,如果有,直接返回构建好的_____YYModelMeta对象,如果没有找到或者needUpdate属性标记为true,则根据cls创建一个新的_YYModelMeta对象,并且存入缓存。这样不需要每次都创建,提高了性能。

接下来看一下initWithClass:方法,

下面分析几个重要的方法:

YYModel的总体思想是以Model属性的类型为准,如果JSON中对应名称的value的类型和Model属性类型不一致,会对value的类型进行转化,保证和Model属性的类型一致。如果兼容不了,不进行属性赋值。下面分析一下ModelSetValueForProperty方法:

该方法上文中提到该方法是用来JSON转成Model的过程中对Model中的属性进行赋值的方法,该方法做了部分基本类型的兼容:

YYModel还提供了一些工具方法,下面简单分析一下:

YYModel作为一个负责JSON数据和Model转化的库,十分易用和高效,特别是做了一些类型的兼容和转化,避免了服务端接口数据类型和客户端Model对象类型不兼容导致的问题,例如执行了不存在的方法而导致崩溃。另一方面,对YYModel的学习在一定程度也促进了对runtime机制的学习和了解。

关于YYModel的分析到这儿先告一段落,由于本人的iOS基础有待提升,再加上表达能力有限,文中许多地方的分析和思路,表达的不是很准确和清楚,希望通过今后的学习和练习,提升自己的水平。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13388364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-26
下一篇 2023-07-26

发表评论

登录后才能评论

评论列表(0条)

保存