项目中的文章列表分为最新和最热两个列表,格式完全一样,需要在一个页面上切换两个列表的显示。

方案一:

一个tableview,三个数据数组(一个最新,一个最热,一个指针引用),然后用segment切换来控制tableview的加载数据,切换时用reloaddata重新加载需要显示的数据。需要说明tableview加了下拉刷新的功能。

实现:功能已实现。

问题:

  1. 切换时重新加载内容,徒增性能损耗;

  2. 因为cell中有作者头像,是从互联网上加载的,因此每次重新加载tableview时都重新下载一遍头像,这对流量无端的损耗是不可饶恕的,是注定要被用户抛弃的。即使使用了异步加载,图像缓存技术,但是这个隐患还是很大。

  3. 滚动位置在切换时丢失,这个丢失是对用户体验而言的。实际是两个数据源大小不同,tableview的显示位置固定,影响用户体验。

  4. 下拉刷新完成后也会重新加载内容,如果刷新中切换页面,可能导致刷新内容丢失,或者刷新提示混乱。

  5. 试图解决方案:在界面上创建两个tableview实例,因为两个列表内容格式和显示样式完全一致,因此复用默认的tableview,最恰当。因此我就希望用深度复制的办法创建一个新的实例,这样两个tableview互不影响,又达到复用的目的,但是遗憾的是复制实例,报错,貌似不支持。

方案二:

顺着方案一的思路,在界面上方两个tableview,为了复用性,我们在storyboard上的view上拖一个tableview,绑定自定义的blogtableview类。界面会自动创建一个tableview,我们在界面初始化函数中再创建一个blogtableview实例,因为这个类绑定了界面,因此实例后就能复用了界面上的格式和布局了(我是这么认为的,刚好用这个方案验证类和界面绑定的关系),我们把刷新函数和数据源,代理函数全放在自定义类中,彻底分离两个列表实例。主界面类只负责tableview实例创建和界面切面的工作。这样原来一个类实现的功能就要放到一个控制类一个业务类中了,其实我觉得这个分离是合理优化。

实现:等下了火车验证。

方案三:

在界面上拖两个tableview,格式和布局完全一样,这种方案我是接受不了的。