背景:最近后台决定传给我一个树结构的json数据,每个子节点有目录结构,类似0001 0001
要求:
- 以列表的方式展示分组,能够折叠展开
- 当传过来的叶子节点为可编辑并且有值时,需要其结构上的父节点的值相对改变(增加或者减少)
- 当改变叶子节点的值时,父节点的值需要层层改变。
最初想法与实现:
- tableview列表需要有一组数据
- 既然要根据子节点改变父节点的值,需要把树结构的所有子节点放入一个数组中进行遍历。遍历存入数组时,,先存储根节点,每一层都可作为根节点,然后存储下一层节点,进而下一层节点即为根节点数组,以此循环。同时把可编辑节点目录存入一个数组
3.根据可编辑节点数组,截取节点的上级节点目录,去遍历存储所有节点数组,依次改变值
存在问题:
- 需要进行多次do...while循环,费时占内存,界面已经加载,数据突然改变的问题
- tableview列表的数据,因为刚开始没有展开,所以只存储了根节点,把根节点的子节点付给cell,点击展开的时候,把子节点插入列表数组。但之后发现根节点可能也需要根据可编辑子节点已有的值进行值的改变。每进行一次折叠、展开,都需要去所有数组中查询节点的值,很伤,很晕
反思:
把所有数据存入字典中,像一个hash表,当然刚开始的循环存入所有节点的步骤不能省。把节点目录最为key,把节点作为value存入字典。
优点:
- 当改变某一节点值,只需要截取改节点目录,查找上级节点目录,作为key,直接取出节点,不要遍历数组
- 进行tableview的折叠展开,只需要在数组中存储节点,再根据节点目录查找真正的显示值即可。
- 条理清晰,可扩展性强。
我有酒,你有工作吗?来,坐下来谈谈。