iOS-UITableView的最佳化(純手打原創),iosuitableview最佳化

來源:互聯網
上載者:User

iOS-UITableView的最佳化(純手打原創),iosuitableview最佳化
TableView的最佳化一:什麼是TableView的最佳化以及為什麼要最佳化

1)CPU(中央處理器)和GPU(圖形處理器)   CPU主要從事邏輯計算的一些工作 GPU主要從事圖形處理方面的工作

2)CPU和GPU的共同點:

都有自己的緩衝體系 都有自己的數字和邏輯運算單元 都為了完成計算任務而設計

3)CPU和GPU的不同點:

CPU的核少但是核內空間非常大 能夠處理複雜的邏輯

GPU核多但是每個核的空間相對較小 故而處理複雜邏輯的空間較少

針對CPU和GPU的上述不同,面對一個程式系統分配給CPU的往往是較為複雜的邏輯運算,分配給GPU的通常是圖片等控制項的操作

4)上述不同而導致的結果

當程式員為CPU編程時,傾向於用複雜的邏輯結構最佳化演算法來減少計算任務的時間 Latency

為GPU編程->利用其能夠處理海量資料的優勢,來提高總的資料的輸送量 來掩蓋Latency

5)為什麼最佳化

學術上:平衡CPU和GPU在工作上的壓力,從而正確的使用CPU和GPU的資源,使他們均勻的負載 這樣子使得FPS保持在60幀左右,最終使得使用者體驗更加美好

非學術上:掌握UITableView能夠給面試加分

二:UITableView的工作原理

1)tablewView代理方法的執行順序

UITableView返回多少組----->每組返回多少行cell--->計算每個cell的高度---->指定cell(cell布局)

2)cell的複用

原理:當滾動列表時(UITableView)部分cell會移除Window 但是移除的cell並沒有被立即釋放 而是放到了一個叫做複用池的對象池中,處於待定狀態,當有新的cell要出現在Window介面上時,首先會從複用池中尋找是否有相同類型的cell,如果有直接拿過用(最直觀的表現是新出現的cell有沒有開闢新的記憶體空間),如果沒有,建立一個新的類型的cell,所以UITableView可能擁有多種類型的cell,複用池也可能儲存著多種類型的cell,系統通過定義reuseIndentifer作為每個cell的唯一標示符來確定即將出現的cell複用何種類型的cell

三:UITableView的具體最佳化

1)盡量使用cell的複用

使用cell的複用,可以減少記憶體的開銷,沒有開闢新的空間,也減少了一些計算量

2)對於不定高的cell 提前將每個cell的高度存入數組,出現一個cell的時候,直接從數組中拿出確切的高度即可,不用臨時計算cell的高度

圖文混排、評論 

對於固定高的cell和不定高的cell同樣適用

3)涉及網路請求載入資料在UITableView滑動結束的時候在進行載入資料(渲染)避免卡頓

1.UITableView繼承自UIScrollView,繼承了後者的方法

//滑動結束的方法

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

//減速結束之後的方法

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

2.if(self.tableView.dragging==NO&&self.tableView.decelerating==NO)在tableView必須實現的二個方法中(載入cell的方法中)將資料的渲染寫在上述if語句中

4)對於tableView的自訂控制項 尤其是UIImageView,盡量減少使用圓角,陰影等layer屬性,盡量減少使用alpha(透明度)來設定透明度,(在項目開發中,讓UI設計師設計原圖就是帶圓角的圖) 陰影,圓角這些layer效果都是在GPU中完成的

1.當多個視圖重疊時,GPU會進行合成渲染,而渲染的最慢的操作就是混合,因此當視圖結構太過複雜,就會大量消耗GPU的資源,所以當一個空間本身是不透明,注意設定alpha為1,這樣可以避免無用的alpha通道合成,降低GPU的負載

2.對控制項設定cornerRadius後對其進行clip或mask操作時 會導致offscreenrendering這個也是在GPU中進行的 如果在滑動時 圓角對象太多 回到GPU的負載大增幅

這時我們可以設定layer的shouldRasterize屬性為YES,可以將負載轉移給CPU 更徹底的是直接使用帶圓角的原圖

5)盡量使用懶載入

又稱為消極式載入 實際上是重寫某個對象的getter方法 原理:程式一開始並不對它進行初始化 而是在用到他的時候 才為他開闢記憶體供它使用

好處:

1.不必將建立的對象的代碼全部寫在ViewDidLoad中,代碼可讀性強

2.每個控制項的getter方法,分別負責各自的執行個體化處理,代碼彼此之間獨立性強 松耦合

6)減少返回給的cell裡面的處理邏輯和處理時間

驢媽媽為例:各個UI控制項整合到一起 實際上只有一個控制項

7)設定每個cell的opaque屬性 ----面試亮點

opaque意思是不透明的 渾濁的 有YES和NO二個結果

alpha 透明度

如果控制項本身不透明,我們設定opaque為YES

8)分段載入資料

設定分頁載入資料 也就是上拉重新整理和下拉載入

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.