SliderPageReuseManager-让你的多表滑动切换视图支持复用!

一、前言

看过网易新闻、今日头条APP的都知道,他们的首页有很多频道,而且支持左右滑动来切换频道。作为一名iOS开发者,你肯定想过这个功能该怎么实现,其实挺简单,用UIScrollView内嵌UITableView就可以。但是当我们面临数量较多(10个左右)的频道时,如果一个频道用一个UITableView,那么你的APP很有可能在你左右滑动过程中内存飙升,最终崩溃...当然这并不是我们所想看到的。

二、思考解决方案

这个时候我想你第一个想到的解决方案应该是:复用!
没错,复用,就像UITableView里对Cell的复用一样,我们也要对ScrollView里的UITableView(更准确点说是ScrollView的每个page)进行复用。
,我先放出我实现的SliderPageReuseManager(github地址),然后再简单介绍一下我所实现的功能。

三、如何进行复用

我们都知道UITableView复用Cell时,我们只需要调用一个dequeueReusableCellWithIdentifier方法即可,这个方法会取出可复用的Cell返回给我们,当没有可复用的Cell时,会自动会我们实例化一个Cell,仿照这个思路,我制定了以下方案:
首先,定义一个复用池数组(reusePool),定义一个最大容量属性(capacity),当池子没有达到最大容量时,会实例化新的page,否则会取出数组中的第一个page进行复用。
其次,类似UITableViewCell的indexPath,为page扩展一个reuseKey属性来作为唯一标识,在进行实例化新page或者复用旧page前,需要先从复用池里进行一次遍历,如果找到一个reuseKey一样的page,则直接返回此page,相当于找到了原来缓存的page。

四、一些细节考虑

  1. 一般来说,这种多表滑动切换视图有2种实现方案,一种UIScrollView嵌套UITableView,直接在一个Controller里搞定,还有一种就是把page封装到一个独立的Controller里,通过childController的形式来管理,这种方式封装性较好,不同page通过不同的Controller管理,简洁易维护,我个人也是比较喜欢这种方式。因此,SliderPageReuseManager为UIViewController和UITableView都扩展了reuseKey属性。
  2. 为了满足不同page对应不同ViewController的需求,提供了一个registe接口供注册可复用的Class(可以是TableView或者ViewController),就像UITableView注册自定义Cell一样:)
 - (void)registerClass:(Class)someClass forReuseIdentifier:(NSString *)identifier
  1. 项目中ViewController可能是纯代码,也可能是通过xib或者storyboard实例化的,为了能满足不同的实例化需求,为UIViewController扩展了reuseInstance方法,默认是alloc init方式,你可以根据你的需要重写此方法
/**
 *  提供复用时实例化方法
 *  可以是基本的[[self alloc] init],也可以通过storyboard实例化
 */
 + (instancetype)reuseInstance;
  1. 每一个page再被复用的时候,是需要做一些处理的,比如清除原来显示的数据(因为是不同的page,数据源不同),再加载新数据,所以扩展了一个属性:isReused,ViewController额外扩展了一个方法:
 - (void)prepareForReuse;

复用的时候比较友好的处理流程是:优先获取本地缓存数据,如果无缓存再取服务端数据。

  1. 至于复用池容量capacity的选择,这个没有什么标准,只要遵循一个原则:不能太多(越多,内存需求越大),也不能过少(过少,左右滑动的时候会不连贯),好吧,说了等于没说...

五、附上效果图

screenshot1.gif

screenshot2.gif

六、结束语

文笔和能力有限,如果大家觉得有问题或者可改进的地方,欢迎指正,感激不尽!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,646评论 4 61
  • 最近怎么睡都是睡不够的状态,想想其实挺正常,毕竟4月的到来也就是过几天的事情。潮湿的回南天持续了这么久,底裤袜子想...
    AnotherG阅读 2,118评论 0 0
  • 他已经超过24小时没有理我 对方在社交软件回复和聊天都不是很热络 我常常会陷入自我怀疑 他还喜欢我吗 可每当我见到...
    crush_forever阅读 1,450评论 0 0
  • 宝宝们这个年过得如何呢?今天我的早教分享也要“上班”了。系统跟大家啰嗦一下,宝宝们回农村老家过年要注意的那些事儿吧...
    未央之雨阅读 1,675评论 0 0
  • 已经很久没有在QQ上面写写文章了,似乎文章已经远离我而去,抛弃了我。今天心血来潮,提笔写些吧! 从2012年到现在...
    GibsonGuo阅读 2,972评论 0 0

友情链接更多精彩内容