【iOS】tableView的優(yōu)化

在IOS開發(fā)中闷板,UITableView是最重要逗柴,最常用的控件之一蛹头。而對于UITableView的優(yōu)化,也是IOS開發(fā)程序員必須要思考的問題。剛好前段時間渣蜗,做的一個項目就碰到有關(guān)UITableView優(yōu)化屠尊,自己也找了很多資料,所以在這里整理一下我對tableView優(yōu)化的理解耕拷。

1.cell的重用

UITableView中最重要的就是cell的重用機制讼昆,只要是用了UITableView控件,就必定會涉及cell的重用骚烧。cell的重用機制:當tableView顯示的時候浸赫,只會創(chuàng)建在可視范圍的cell,為了使這些cell可以重用赃绊,cell在創(chuàng)建的時候會有一個重用標識 ReuseIdentifier既峡。當屏幕滾動時,有部分cell就會被移出屏幕碧查,這些cell會被放到一個緩存池中运敢,等待重用。當需要顯示一個cell的時候忠售,首先會到緩存池中查看有沒有對應的可重用的cell传惠,如果有,就直接拿來用稻扬,如果沒有涉枫,再去創(chuàng)建,這樣就會大大減少內(nèi)存的消耗腐螟。

    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.緩存行高

在呈現(xiàn)cell之前愿汰,把cell的高度計算好緩存起來,避免每次加載cell的時候都要計算乐纸。對于高度的計算衬廷,還有個小細節(jié)需要注意汽绢,就是如果 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自己對應內(nèi)容跌宛,直接獲取高度,這個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积仗,刷新界面的疆拘,為了不影響界面的流暢程度,耗時的操作都放到子線程去執(zhí)行寂曹。

4.盡量不要去添加和移除view, 先將會用到的控件懶加載,要就顯示,不要就隱藏哎迄。如果cell中有圖片控件回右,就使用異步加載圖片。

5.減少cell上subviews的數(shù)量

UITableViewCell包含了textLabel漱挚、detailTextLabel和imageView等翔烁,而你還可以自定義一些視圖放在它的contentView里。然而view是很大的對象旨涝,創(chuàng)建它會消耗較多資源蹬屹,并且也影響渲染的性能。

6.cell里面的控件,約束最好不要使用remake,動態(tài)添加約束是比較耗性能的

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()
        //結(jié)束上下文
        UIGraphicsEndImageContext()

        let end = CACurrentMediaTime()

//        CJPrint("異步繪制時間:\(end - start)")

        //返回繪制好的圖片
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            drawFinish(image: newImage)
        }
    }
}
image.gif
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泽谨,一起剝皮案震驚了整個濱河市脓杉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆赃,老刑警劉巖鸟赫,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒜胖,死亡現(xiàn)場離奇詭異,居然都是意外死亡抛蚤,警方通過查閱死者的電腦和手機台谢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岁经,“玉大人朋沮,你說我怎么就攤上這事∽喝溃” “怎么了樊拓?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塘慕。 經(jīng)常有香客問我筋夏,道長,這世上最難降的妖魔是什么图呢? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任条篷,我火速辦了婚禮,結(jié)果婚禮上蛤织,老公的妹妹穿的比我還像新娘赴叹。我一直安慰自己,他們只是感情好指蚜,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布乞巧。 她就那樣靜靜地躺著,像睡著了一般姚炕。 火紅的嫁衣襯著肌膚如雪摊欠。 梳的紋絲不亂的頭發(fā)上丢烘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天柱宦,我揣著相機與錄音些椒,去河邊找鬼。 笑死掸刊,一個胖子當著我的面吹牛免糕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忧侧,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼石窑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚓炬?” 一聲冷哼從身側(cè)響起松逊,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肯夏,沒想到半個月后经宏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡驯击,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年烁兰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徊都。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡沪斟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暇矫,到底是詐尸還是另有隱情主之,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布李根,位于F島的核電站杀餐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏朱巨。R本人自食惡果不足惜史翘,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冀续。 院中可真熱鬧琼讽,春花似錦、人聲如沸洪唐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凭需。三九已至问欠,卻和暖如春肝匆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顺献。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工旗国, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人注整。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓能曾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肿轨。 傳聞我的和親對象是個殘疾皇子寿冕,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 我們上了一節(jié)實驗課,來張紙把紙撕成了兩張紙條椒袍,一個手拿一張紙條放到嘴邊吹驼唱,有趣的事情就來了,本以為兩張紙條能分開驹暑,...
    幸福妮_0a9e閱讀 170評論 0 0
  • 車窗外一閃而過的行人玫恳,快速后退的街景,或熟悉或陌生的一隅岗钩,經(jīng)年不變的公車纽窟。然后發(fā)現(xiàn),視野里最亮的是倒映在車窗上的我...
    咖啡過敏患者閱讀 92評論 0 0
  • 此刻的天衣兼吓,也不敢直視那方形水晶里的秦皇了臂港。他們一行人就跪在地上,虔誠的叩拜著视搏。在行完三拜大禮后审孽,爺爺便開口向...
    Pan龍騰閱讀 287評論 0 1
  • 幸福是一首歌,很靜浑娜。如同曠野的明月佑力,遠山,近樹筋遭;幸福是一首歌打颤,很動。如同大江的波濤漓滔,飛浪编饺,暗涌、平靜中的漩渦响驴;幸福...
    屈道秋閱讀 115評論 0 0