项目中对tableView优化、对多个模型的包装及适配、缓存cell高度

因原项目某些模块在滚动时异常的卡顿,需要对tableView进行优化,项目每个模块都需要横竖屏适配,以及白天夜晚模式;
优化过程:
1.一开始由于此模块是通过xib搭建的,且多图展示是在scrollView上的,当每次有cell出现时都会移动并创建imageView在scrollView上,所以我先从展示图片的scrollView上下手,因为在横屏时最多只让展示5张图片,所以我在初始化cell时,在scrollView上创建5个imageView,然后每当有cell出现时,判断有没有超出5张图片,如果超出了就创建对应的imageView,并更新scrollView的约束,当做完以后发现只是好了一点而已,达不到理想中的优化效果;
2.这个模块是经过好几个人手一点点拼凑起来的,且所有的控件都暴露在头文件,不易维护,虽然有4个模块在使用此cell,但当时也没有其他任务,我就决定使用纯代码重写此控件,一开始我通过masonry对子控件进行布局,写的过程中我决定要把那些使用此cell模块的模型包装成一个类(我起名叫BeanViewFrame)给cell传递数据,但问题是使用此模块的控制器中到处都在通过原来的模型获取数据或更改数据,如果我把那些控制器的模型都更改为包装后的BeanViewFrame是件非常麻烦的事情,所以我又通过适配器模式将包装后的BeanViewFrame单独缓存到一个集合中,并不会破坏原数据源,配合缓存cell高度的分类一起使用,但是最终还是感觉滑动出现cell时会卡以下;
3.最终方案:在cell中开始图形上下文,将cell上主要的控件画在图片上展示,并在滑动时按需加载cell,最终达到的优化效果确实非常理想!但是此种方法需要事先拿到需要画的控件的frame,所以这里不能采用约束布局了,我在BeanViewFrame中将所有cell的frame以及cell的高度计算好,然后在画的时候就可以拿到准确的frame了,最后一点就是做横竖屏适配时,监听UIApplicationWillChangeStatusBarOrientationNotification状态改变,让tableView刷新数据,注意不要监听UIDeviceOrientationDidChangeNotification状态改变,因为它在app即将进入前台和即将进入后台时都会调用,导致数据刷新频繁;

这里把项目中对tableView的优化以及在项目中如何对多个模块使用单独拿出来写成了一个demo!GitHub地址

屏幕快照 2017-03-19 下午10.05.47.png

你可能感兴趣的:(项目中对tableView优化、对多个模型的包装及适配、缓存cell高度)