Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mj_setKeyValues处理嵌套的子模型没有处理空数据 #800

Open
ATMLGG opened this issue Dec 15, 2020 · 4 comments
Open

mj_setKeyValues处理嵌套的子模型没有处理空数据 #800

ATMLGG opened this issue Dec 15, 2020 · 4 comments
Labels
Milestone

Comments

@ATMLGG
Copy link

ATMLGG commented Dec 15, 2020

对于嵌套的模型,子节点下模型原来有值,赋值的数据中某些字段没有值,使用mj_setKeyValues赋值后,原来有值的字段因为被新数据直接覆盖,会出现空值

理想情况:子节点下新值为空,老值有数据,应该不覆盖沿用老值

具体情况可以看图中parent.name和child.testUrl
WX20201214-182933@2x
WX20201214-182943@2x

@wolfcon
Copy link
Collaborator

wolfcon commented Dec 16, 2020

那遇到需要全部覆盖的要怎么处理
遇到一个需要覆盖, 另外一个不需要覆盖的又怎么处理

这里你应该自己实现, 而不是使用 mj_setKeysValues, 这个方法不应该这样用.
如果想自定义那么就自己实现一个.

@wolfcon wolfcon closed this as completed Dec 16, 2020
@ATMLGG
Copy link
Author

ATMLGG commented Dec 16, 2020

那遇到需要全部覆盖的要怎么处理
遇到一个需要覆盖, 另外一个不需要覆盖的又怎么处理

这里你应该自己实现, 而不是使用 mj_setKeysValues, 这个方法不应该这样用.
如果想自定义那么就自己实现一个.

1.如果需要覆盖,为什么不用类方法初始化?你这个是实例方法,不就是用来改写对象属性吗?
2.退一步说, mj_setKeyValues按你的说法是会覆盖老值的,为什么在mj_setKeyValues:context:方法的mj_enumerateProperties回调中,要判断value值是否为空,为空直接return?覆盖不应该是判断新值为nil,把老值置nil吗?对应到issue中的截图,parent.name赋值后应该为nil才对.同一个方法,父子节点效果不一致
3.归根结底是在赋值操作时,采用KVC,对MJPropertyType不属于Foundation框架时没有单独进行判断,而是在父节点逻辑中判断子节点不属于Foundation,通过mj_objectWithKeyValues:context:直接alloc了一个新的子模型,把新的模型直接赋值,未考虑嵌套情况
WX20201216-142744@2x
WX20201216-142808@2x
在第二张图中对子节点模型类型进行判断,再走一遍mj_setKeyValues中的逻辑就能够达到这个目的
虽然这个是开源项目,难免有不那么完美的地方,但还是希望各位大佬能够好好维护,目前已替换为YYModel
直接close issue可能看起来好看,但是问题并没有解决,望共勉

@wolfcon
Copy link
Collaborator

wolfcon commented Dec 16, 2020

  • 首先, 这是一个内部方法, 对外的 API 为文档中描述的那些, 这个方法并没有在文档中提及, 你在不了解内部逻辑的情况下不应该使用.
  • 再者, 你要使用内部方法, 那么内部方法是有其特殊实现逻辑的, 不是为其他通用逻辑而设定的
  • 你是 Issue 的发起人, 你有权再开 Issue, 关闭它并不是可能看起来好看, 是因为觉得 "你利用你的聪明大脑, 使用了内部特殊方法, 达成了你要的特定目的, 而又在需求变化后, 不能实现你特殊目的来这里质疑内部方法是否有问题." 这个问题并不是 SDK 的问题, 而是你想要 SDK 的私有方法对外使用的问题.

这里再次声明下, 这个私有方法是针对新创建类(由公开 API 调用)进行的赋值方法, 并没有考虑到要给外部已经有值的类赋值这类情况, 你如果想要实现你的特殊逻辑, 建议你自己写一个公开方法.

千人千面, 各有需求, 不能为了你的一己需求修改逻辑. 试想今天你来要求这个需求, 明天他来要求那个需求, 那么到底要哪个需求?

@ATMLGG
Copy link
Author

ATMLGG commented Dec 16, 2020

  • 是否对外API有无明确标明?如果不对外,放umbralle.h让外部调用?

  • 同上,不知道为什么一样的问题你那聪明的大脑要写两遍

  • 我不开issue是因为你解不解决这个问题我根本不在乎,来提issue是想让这个项目更加完善,为什么YYModel性能更高更兼容,可不是因为随意的文档和不规范的代码,乐于接受各种建议是拉开与这个项目的差距的原因之一

从你第一次回答就可以看出,这个项目的私有方法并没有那么私有,代码也没有那么规范,如果不想外部调用,请放好你的接口,完善你的文档和Readme,不要出了问题就说你怎么用这个方法,建议自己写一个公开方法(然而放眼望去就没有不公开的),似乎提一个完善文档和Readme的issue更加合适

WX20201216-163110@2x

最后,如果一个项目,今天你的需求能实现,明天他的需求也能兼容,这才是一个好项目

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants