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

六、结束语

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

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