tableView優(yōu)化

tableview的優(yōu)化一直是一個很考驗基本功的活兒斯议,之前做項目的適合被這個問題困擾了很久沉填,通過性能工具有鹿、查閱文檔解決吊奢,整理思路和解決方案如下:
tableview優(yōu)化最主要:復用cell茉继,header咧叭,footer實例;使用約束布局cell子控件時不多次添加約束烁竭;圖片不過大菲茬,盡量不使用透明視圖;避免阻塞主線程派撕;計算高度方法不做大量邏輯處理婉弹。
cell是否使用了復用機制而不是每一次都創(chuàng)建新的cell。
如果每次都創(chuàng)建新的cell终吼,在滑動的時候會表現(xiàn)為:剛開始的時候很順暢镀赌,但是會越來越卡,內(nèi)存跟著一直升高衔峰,停止滑動的時候也不會降下來佩脊。使用緩存機制創(chuàng)建的cell,開始滑動的時候內(nèi)存會開始上升垫卤,等創(chuàng)建了一個屏幕再加半屏的cell之后威彰,內(nèi)存趨于平穩(wěn)。
cell是否添加了大量的子控件穴肘,或者對layer做了過多的操作歇盼。
如果添加了大量的子控件,使用drawRect方法添加子控件评抚,平衡GPU與CPU的負擔豹缀。同時還需要注意盡量使用不透明視圖和不重疊的漸變,否則會加大GPU的負擔慨代,造成性能不佳邢笙。

補充:請謹慎使用drawRect:
方法,當cell中只有少量的子視圖時侍匙,應(yīng)當避免使用氮惯,因為重寫drawRect:
就是在此方法中一句代碼都不寫也會占用5-6M的內(nèi)存。
高度計算方法時不做復雜的計算,盡量只使用加減乘除妇汗。
自適應(yīng)高度的cell實現(xiàn)方式有很多種帘不,比如,1.使用iOS7以上系統(tǒng)的
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
這個方法中杨箭,可以先給一個估計的高度寞焙,系統(tǒng)會從你給定的高度再去計算實際高度。但是在使用過程中會出現(xiàn)cell突然變高變得低的情況互婿,不適用于高度變化太大的cell捣郊。2.如果使用約束布局創(chuàng)建的cell子控件,子控件之間都建立了相互約束慈参,最上面的子控件與cell頂部建立約束模她,最下面的子控件與cell底部建立了約束,相當于子控件把cell撐開了懂牧。

約束簡圖

這時在高度計算方法中侈净,走一遍cell的loaddata方法后可以通過
func systemLayoutSizeFittingSize(targetSize: CGSize) -> CGSize

取得cell的size,進而得到cell高度僧凤。通過這個方法獲取的cell高度是十分精確的畜侦,只要創(chuàng)建好子控件的約束就能獲得cell的size。比較不好的是只是這種方法會重走一遍cell的loaddata方法躯保。除此之外在調(diào)用cell的loaddata之前需要得到cell的實例旋膳,實例創(chuàng)建的方式應(yīng)該與cellForRow方法一樣,優(yōu)先從緩存池中取得途事。這個方案可能會創(chuàng)建多個cell验懊。如果能在內(nèi)存匯總保存一份cell的實例就能解決這個問題了!我講講我實現(xiàn)的思路:首先先注冊cell,當緩存池中沒有cell時系統(tǒng)會自動創(chuàng)建尸变,有的話會直接取緩存中的cell返回給你义图。
override func viewDidLodad() { tableView.registerClass(CardCell.self, forCellReuseIdentifier: ID)}

用lazy創(chuàng)建一個cell實例,由于lazy 關(guān)鍵字召烂,cell的創(chuàng)建只會執(zhí)行一次lazy var cell:CardCell = { //已經(jīng)注冊過cell碱工,當緩存池中沒有cell時系統(tǒng)會自動創(chuàng)建,有的話會直接取緩存中的cell返回
let v = self.myTableView?.dequeueReusableCellWithIdentifier(self.ID) as! CardCell return v }()

通過懶加載的方式奏夫,只創(chuàng)建一次cell的實例怕篷,避免內(nèi)存浪費。接下來要做的步驟就是之前講的酗昼,調(diào)用cell的loadData方法廊谓,計算高度
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { self.imageCell.loadData(d) let height:CGFloat = self.cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).heightreturn height}

之前查資料的時候還有用空間換取時間的方案:1)在請求網(wǎng)絡(luò)數(shù)據(jù)成功后就計算好高度并通過字典或者數(shù)組保存高度值,在高度方法中直接根據(jù)數(shù)組下標或者key值取得高度并返回麻削。2)還有建立一個frameModel的方法蒸痹,與1中相似舔示,只是獲得網(wǎng)絡(luò)數(shù)據(jù)后保存到frameModel中,在frameModel中定義一個類方法电抚,通過獲得的model值計算高度后返回。
避免快速滑動情況下開過多線程竖共。
cell中的圖片開線程異步加載蝙叛,相信每個人都會想到。線程開過多了會造成資源浪費公给,內(nèi)存開銷過大借帘。圖片過多時可以不要一滾動就走cellForRow方法,可以在scrollview的代理方法中做限制淌铐,當滾動開始減速的時候才加載顯示在當前屏幕上的cell(通過tableview的dragging和declearating兩個狀態(tài)也能判斷)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var canLoad:Bool = !tableView.dragging && !tableView.declearating if canLoad { //開始loaddata肺然,異步加載圖片 }}

圖片處理
1)后臺下載圖片后再回主線程刷新UI,避免阻塞主線程腿准。2)圖片過大回造成GPU負擔過大际起,可以在圖片下載后壓縮尺寸后顯示3)避免對layer做過多的操作,盡量設(shè)置圖片為不透明

補充:
簡單的設(shè)置cornerRadius是不會影響性能的吐葱,但是設(shè)置了maskToBounds街望,會導致離屏渲染,應(yīng)減少設(shè)置圖層 maskToBounds = YES 弟跑,灾前;
使用懶加載圖片的方式避免重復下載圖片,浪費資源孟辑。圖片下載后并做壓縮處理后將其保存到緩存中哎甲,下次加載此圖片之前先從緩存中取,如果取不到該圖片就在后臺下載保存饲嗽。
使用Core Graphics實現(xiàn)圓角等功能炭玫。
重寫drawRect方法會離屏渲染,導致內(nèi)存急劇上升貌虾,即使在這個方法里面不寫一句代碼础嫡,也會讓內(nèi)存升高。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酝惧,一起剝皮案震驚了整個濱河市榴鼎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晚唇,老刑警劉巖巫财,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哩陕,居然都是意外死亡平项,警方通過查閱死者的電腦和手機赫舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闽瓢,“玉大人接癌,你說我怎么就攤上這事】鬯希” “怎么了缺猛?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長椭符。 經(jīng)常有香客問我荔燎,道長,這世上最難降的妖魔是什么销钝? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任有咨,我火速辦了婚禮,結(jié)果婚禮上蒸健,老公的妹妹穿的比我還像新娘座享。我一直安慰自己,他們只是感情好似忧,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布征讲。 她就那樣靜靜地躺著,像睡著了一般橡娄。 火紅的嫁衣襯著肌膚如雪诗箍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天挽唉,我揣著相機與錄音滤祖,去河邊找鬼。 笑死瓶籽,一個胖子當著我的面吹牛匠童,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播塑顺,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汤求,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了严拒?” 一聲冷哼從身側(cè)響起扬绪,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎裤唠,沒想到半個月后挤牛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡种蘸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年墓赴,在試婚紗的時候發(fā)現(xiàn)自己被綠了竞膳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡诫硕,死狀恐怖坦辟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情章办,我是刑警寧澤锉走,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站纲菌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疮绷。R本人自食惡果不足惜翰舌,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冬骚。 院中可真熱鬧椅贱,春花似錦、人聲如沸只冻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喜德。三九已至山橄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舍悯,已是汗流浹背航棱。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萌衬,地道東北人饮醇。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像秕豫,于是被迫代替她去往敵國和親朴艰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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