今天來簡要介紹下iOS開發組件UITableViewController中的Cell循環機制。
前言
當前iOS設備的內存是有限的。當使用Table View來展示數據時,假設行數有成千上萬行,則一次性生成這么多的cell,顯然會帶來極大的內存消耗。因此,iOS只對即將滾動出現的cell進行“配置”;并引入了對UITableViewCell的循環機制,把即將滾動消失的cell緩存起來以循環利用,這樣便大大優化了內存管理。
Cell循環的傳送帶模型
Cell的循環機制可以類比為傳送帶模型,如下圖所示:
假設Table View從下往上滾動,虛線框中的是這個Table View的可見cell部分。這里有2種不同類型的cell,分別記為A類和B類。則此刻,可見cell分別是A類的a2 cell、B類的b1 cell與A類的a3 cell;已經滾動離開的cell有A類的a1 cell;即將滾動顯示的cell有B類的b2 cell、A類的a4 cell等。
由于a1 cell已經滾動離開了可見cell區,則它被撤下傳送帶,放入A類的Cache Cell集合中,為下次復用做好準備。
當b2 cell要滾動進入可見cell區時(a2 cell相應地滾動離開,進入cache集合),首先在B類 Cache Cell集合中尋找是否有可以復用的cell,結果是沒有找到,則根據cell的identifier和cell模板新創建一個B類cell,進行數據配置,然后隨著傳送帶滾動進入可見cell區。
當a4 cell要滾動進入可見cell區時,首先在A類 Cache Cell集合中尋找是否有可以復用的cell,由于之前a1、a2 cell已經進入了該集合,故a4 cell可以復用之前已經創建的cell,而不需要額外創建新的cell。對獲得的cell進行數據配置,然后傳動帶將該cell送入可見cell區。
獲取cell:dequeueReusableCellWithIdentifier
iOS在內部實現了傳送帶模型,我們只需調用UITableView的下列api,就能獲取一個或是新建,或是復用的cell:
@available(iOS 6.0, *)
public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell
public func dequeueReusableCellWithIdentifier(identifier: String) -> UITableViewCell?
對cell進行配置
在獲取cell后,一般需要對cell的content進行配置,然后將配置后的cell展示出來。有以下3種方法能夠對cell進行content配置,在這里大概提下,具體可以查看官網文檔。
- cellForRowAtIndexPath。這是最常用的一種方法,也是遵循UITableViewDataSource協議時必須實現的方法。一般在這里對cell內部的各個組件進行數據配置。
- prepareForReuse。這個方法在dequeueReusableCellWithIdentifier返回cell前調用。一般在這里對cell的非content屬性進行配置(如:editing、selection屬性等)。
- willDisplayCell:forRowAtIndexPath。這個方法在cellForRowAtIndexPath之后調用,也是cell在顯示在屏幕前的最后一步能夠進行修改的地方。一般在這里對cell進行狀態改變信息的配置(如:selection屬性、背景顏色等)。
結語
以上是對Table Cell循環機制的一些雜談,若有不足之處,請予指正。希望這篇文章對你有所幫助_。