接口冥等设计

191 阅读1分钟

幂等设计: 任意多次执行所产生的影响均与一次执行的影响相同。 比如用户购买同一商品不会由于多次发起请求而导致重复购买。

起因

项目开发过程中,有位同事构建了一个支持折叠展开子项的cell(课程单元下有章节)。当使用tableview的代理方法创建cell时,只有每个cell设置不同ReuseIdentifier时,才能确保折叠与展开两种交互状态的正确性,这意味着cell没有实现内存复用,在数据量大的时候会产生内存暴涨问题。

解决

通过调试,发现tableview在对cell设置数据(setModel)后,未重置折叠展开的状态位S1。 setModel没有直接调用 -layoutsubview,但会通过setNeedsLayout被系统模板方法在某个合适时机间接调用到layoutsubview,而该方法会通过S1呈现展开或收起的状态。

反思

setModel作为暴露给外部使用的接口,要考虑幂等设计:即第一次调用跟第N次调用产生的效果是一样的。 要处理类似问题,开发人员除了清楚了解自己写的逻辑,也要清晰理解系统调用和运行机制。