【iOS】tableView的优化

在IOS开发中,UITableView是最重要,最常用的控件之一。而对于UITableView的优化,也是IOS开发程序员必须要思考的问题。刚好前段时间,做的一个项目就碰到有关UITableView优化,自己也找了很多资料,所以在这里整理一下我对tableView优化的理解。

1.cell的重用

UITableView中最重要的就是cell的重用机制,只要是用了UITableView控件,就必定会涉及cell的重用。cell的重用机制:当tableView显示的时候,只会创建在可视范围的cell,为了使这些cell可以重用,cell在创建的时候会有一个重用标识 ReuseIdentifier。当屏幕滚动时,有部分cell就会被移出屏幕,这些cell会被放到一个缓存池中,等待重用。当需要显示一个cell的时候,首先会到缓存池中查看有没有对应的可重用的cell,如果有,就直接拿来用,如果没有,再去创建,这样就会大大减少内存的消耗。

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: ReuseIdentifier)

    }
image.gif
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier, forIndexPath: indexPath)
        return cell
    }
image.gif

2.缓存行高

在呈现cell之前,把cell的高度计算好缓存起来,避免每次加载cell的时候都要计算。对于高度的计算,还有个小细节需要注意,就是如果 row 的高度都一定,那就删除代理中的这个 tableView:heightForRowAtIndexPath: 方法,设置 Table View 的 rowHeight 属性。

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        //获得模型
        let model = models![indexPath.row]

        //判断模型里面之前有没有缓存过行高
        if model.rowHeight != nil {
            return model.rowHeight!
        }

        //自己算行高:AutoLayout
        //让 cell自己对应内容,直接获取高度,这个cell不参与显示
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier) as! CJStatusCell
        cell.model = model

        let heigth = cell.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height

        //保存行高
        model.rowHeight = heigth
        return heigth
    }
image.gif

3.cellForRowAtIndexPath不要做耗时操作

主线程主要是用来显示UI,刷新界面的,为了不影响界面的流畅程度,耗时的操作都放到子线程去执行。

4.尽量不要去添加和移除view, 先将会用到的控件懒加载,要就显示,不要就隐藏。如果cell中有图片控件,就使用异步加载图片。

5.减少cell上subviews的数量

UITableViewCell包含了textLabel、detailTextLabel和imageView等,而你还可以自定义一些视图放在它的contentView里。然而view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。

6.cell里面的控件,约束最好不要使用remake,动态添加约束是比较耗性能的

7.cell里面的控件,背景最好是不透明的 (图层混合), view的背景颜色 clearColor尽量少

8.图片圆角不要使用 layer.cornerRadius,图层最好不要使用阴影, 阴影会导致离屏渲染

9.异步绘制

我在这边写了一个UIImage的分类,是用来异步绘制。

import UIKit

extension UIImage {
    func cj_AsyncDrawImage(var size: CGSize?, bgColor: UIColor? = UIColor.whiteColor(), isCorner: Bool = false, drawFinish: (image: UIImage)->()) {

        let start = CACurrentMediaTime()

        if size == nil {
            //别人没有传入size
            size = self.size
        }
        //上下文大小为rect
        let rect = CGRect(origin: CGPointZero, size: size!)

        //开启上下文
        UIGraphicsBeginImageContextWithOptions(size!, bgColor != nil, UIScreen.mainScreen().scale)

        //设置背景颜色
        bgColor?.setFill()
        UIRectFill(rect)

        //需要圆角
        if isCorner {
            //路径
            let path = UIBezierPath(ovalInRect: rect)
            //让后面绘制的元素在路径里面
            path.addClip()
        }

        self.drawInRect(rect)

        //获取图片
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        //结束上下文
        UIGraphicsEndImageContext()

        let end = CACurrentMediaTime()

//        CJPrint("异步绘制时间:\(end - start)")

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

推荐阅读更多精彩内容

  • 我们上了一节实验课,来张纸把纸撕成了两张纸条,一个手拿一张纸条放到嘴边吹,有趣的事情就来了,本以为两张纸条能分开,...
    幸福妮_0a9e阅读 170评论 0 0
  • 车窗外一闪而过的行人,快速后退的街景,或熟悉或陌生的一隅,经年不变的公车。然后发现,视野里最亮的是倒映在车窗上的我...
    咖啡过敏患者阅读 92评论 0 0
  • 此刻的天衣,也不敢直视那方形水晶里的秦皇了。他们一行人就跪在地上,虔诚的叩拜着。在行完三拜大礼后,爷爷便开口向...
    Pan龙腾阅读 287评论 0 1
  • 幸福是一首歌,很静。如同旷野的明月,远山,近树;幸福是一首歌,很动。如同大江的波涛,飞浪,暗涌、平静中的漩涡;幸福...
    屈道秋阅读 115评论 0 0