近期有个需求,当一个组件在可视区中间80%范围内出现3S,即上传曝光。组件移出页面再已入,需要再次按规则曝光。
分析
- 因为tableview 和 scrollview 有复用机制,需要考虑曝光对象维护问题,为防止乱,用数据 id作为唯一标识。
- 手机资源紧缺,需要共用一个计时器
- 为了效率问题,需要在多线程上执行曝光逻辑
方案
- 使用基础的数组和字典,存储唯一数据id和曝光时间
- 使用累积的方式计算曝光时间
- 使用全局唯一定时器触发更新曝光时间
- 使用多个线程用于计算、曝光、移除、增加曝光时间。另起一个线程调度多线程计算
数据结构
1 | PageMap<pageName:String, eventMap:EventMap> |
每次由组件触发加载数据,则找到page_name, 再找到component_name, 生成一个data_id1: object的节点。
如果在屏幕上,则设置time为0;如果组件不在屏幕上,则直接把时间设置为10s
调度
创建常驻Timer,用于调度定时器
在多线程上执行操作曝光逻辑。
流程图
Product
github地址: suiming/PetersLab (github.com)