淺談iOS UITableViewController之Cell循環(huán)機(jī)制

今天來(lái)簡(jiǎn)要介紹下iOS開(kāi)發(fā)組件UITableViewController中的Cell循環(huán)機(jī)制。


前言

當(dāng)前iOS設(shè)備的內(nèi)存是有限的。當(dāng)使用Table View來(lái)展示數(shù)據(jù)時(shí),假設(shè)行數(shù)有成千上萬(wàn)行,則一次性生成這么多的cell,顯然會(huì)帶來(lái)極大的內(nèi)存消耗。因此,iOS只對(duì)即將滾動(dòng)出現(xiàn)的cell進(jìn)行“配置”;并引入了對(duì)UITableViewCell的循環(huán)機(jī)制,把即將滾動(dòng)消失的cell緩存起來(lái)以循環(huán)利用,這樣便大大優(yōu)化了內(nèi)存管理。


Cell循環(huán)的傳送帶模型

Cell的循環(huán)機(jī)制可以類(lèi)比為傳送帶模型,如下圖所示:


Cell循環(huán)的傳送帶模型

假設(shè)Table View從下往上滾動(dòng),虛線框中的是這個(gè)Table View的可見(jiàn)cell部分。這里有2種不同類(lèi)型的cell,分別記為A類(lèi)和B類(lèi)。則此刻,可見(jiàn)cell分別是A類(lèi)的a2 cell、B類(lèi)的b1 cell與A類(lèi)的a3 cell;已經(jīng)滾動(dòng)離開(kāi)的cell有A類(lèi)的a1 cell;即將滾動(dòng)顯示的cell有B類(lèi)的b2 cell、A類(lèi)的a4 cell等。

由于a1 cell已經(jīng)滾動(dòng)離開(kāi)了可見(jiàn)cell區(qū),則它被撤下傳送帶,放入A類(lèi)的Cache Cell集合中,為下次復(fù)用做好準(zhǔn)備。

當(dāng)b2 cell要滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)時(shí)(a2 cell相應(yīng)地滾動(dòng)離開(kāi),進(jìn)入cache集合),首先在B類(lèi) Cache Cell集合中尋找是否有可以復(fù)用的cell,結(jié)果是沒(méi)有找到,則根據(jù)cell的identifier和cell模板新創(chuàng)建一個(gè)B類(lèi)cell,進(jìn)行數(shù)據(jù)配置,然后隨著傳送帶滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)。

當(dāng)a4 cell要滾動(dòng)進(jìn)入可見(jiàn)cell區(qū)時(shí),首先在A類(lèi) Cache Cell集合中尋找是否有可以復(fù)用的cell,由于之前a1、a2 cell已經(jīng)進(jìn)入了該集合,故a4 cell可以復(fù)用之前已經(jīng)創(chuàng)建的cell,而不需要額外創(chuàng)建新的cell。對(duì)獲得的cell進(jìn)行數(shù)據(jù)配置,然后傳動(dòng)帶將該cell送入可見(jiàn)cell區(qū)。


獲取cell:dequeueReusableCellWithIdentifier

iOS在內(nèi)部實(shí)現(xiàn)了傳送帶模型,我們只需調(diào)用UITableView的下列api,就能獲取一個(gè)或是新建,或是復(fù)用的cell:

@available(iOS 6.0, *)
public func dequeueReusableCellWithIdentifier(identifier: String, forIndexPath indexPath: NSIndexPath) -> UITableViewCell 

public func dequeueReusableCellWithIdentifier(identifier: String) -> UITableViewCell?

對(duì)cell進(jìn)行配置

在獲取cell后,一般需要對(duì)cell的content進(jìn)行配置,然后將配置后的cell展示出來(lái)。有以下3種方法能夠?qū)ell進(jìn)行content配置,在這里大概提下,具體可以查看官網(wǎng)文檔。

  1. cellForRowAtIndexPath。這是最常用的一種方法,也是遵循UITableViewDataSource協(xié)議時(shí)必須實(shí)現(xiàn)的方法。一般在這里對(duì)cell內(nèi)部的各個(gè)組件進(jìn)行數(shù)據(jù)配置。
  2. prepareForReuse。這個(gè)方法在dequeueReusableCellWithIdentifier返回cell前調(diào)用。一般在這里對(duì)cell的非content屬性進(jìn)行配置(如:editing、selection屬性等)。
  3. willDisplayCell:forRowAtIndexPath。這個(gè)方法在cellForRowAtIndexPath之后調(diào)用,也是cell在顯示在屏幕前的最后一步能夠進(jìn)行修改的地方。一般在這里對(duì)cell進(jìn)行狀態(tài)改變信息的配置(如:selection屬性、背景顏色等)。

結(jié)語(yǔ)

以上是對(duì)Table Cell循環(huán)機(jī)制的一些雜談,若有不足之處,請(qǐng)予指正。希望這篇文章對(duì)你有所幫助_。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,050評(píng)論 4 61
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,625評(píng)論 18 399
  • 三 說(shuō)回來(lái)就回來(lái)了,果真是一句哄騙母親的謊言。在遠(yuǎn)離故土一百多公里的E城,在一切都深感陌生、孤獨(dú)和無(wú)助的新單位,我...
    遲遲癡語(yǔ)閱讀 470評(píng)論 2 5
  • #玩卡不卡·每日一抽# 每一位都可以通過(guò)這張卡片覺(jué)察自己: 1、直覺(jué)他叫什么名字?黑妞 2、他幾歲了? 8歲 3、...
    天音思語(yǔ)閱讀 174評(píng)論 0 0
  • 初識(shí)Core Data “一個(gè)龐然大物,膚色黝黑,面無(wú)表情,應(yīng)該不好相處?!边@是Core Data給我的第一印象。...
    莮亾閱讀 233評(píng)論 0 0

友情鏈接更多精彩內(nèi)容