问题描述
在做任务列表时,发现任务的排序位置并不正常,有些地方会很空
原因分析:
开始以为是自己设置位置出现了问题,后来一步步看设置位置的代码,发现是使用了NGUI的UITabel组件的Reposition进行的位置排列。于是便查看源码,进行断点查看,发现Reposition里面有个GetChildList方法会计算当前节点下面处于显示状态的子节点数量,但我在unity中看只有5个子节点,但此处有时候显示了9个子节点,其中有4个是重复的。此时进行的判断就是因为节点数不对导致位置不正常。
但就是为什么会出现这个情况?这部分的代码的逻辑是先把所有元素删除,在重新添加,我想的就是是不是执行顺序有问题,先增加再执行排列位置再删除,这样才能解释清楚。检查一遍代码后发现并没有问题,直到看到Destroy时才想起他并不是立即删除,而是异步执行,会在下一帧才删除。所以才会发生这个现象,在排列位置时是按照9个元素来排列,排列完后再删除掉那些元素,所以位置会出现问题。
解决方案:
第一时间我想的就是把Destroy方法换成DestroyImmediate方法来立即删除,但考虑如果这部分代码执行的次数过多(老代码遗留问题,应该是刷新时进行更新数据而不是简单粗暴的删除重新创建)可能会阻塞主线程导致卡顿,最后还是给在执行Reposition时做了处理,在0.1秒后执行这个方法,此时删除也已经删除掉了。