Swift — 說說 TableView( reload & updates)

Jeremy Xue
6 min readJul 2, 2018

前言

最近我的 Medium 應該會被陳董粉絲給淹沒了,感謝 Don 大的分享 😂😂😂

好想工作室與豆芽的日常生活

這邊附上一張不相關的圖,只是分享好想工作室的日常 ( 還有豆芽 🐈

因為最近在研究一些有關 TableView 的資訊,在其中看到了兩個同樣也是更新資料的方法,因為之前大部分都是使用 reloadData 方式來進行重載資料的動作,不常使用 reloadRow 與其他兩個 updates 方式來更新資訊,因此我想要來研究他們之間的差別。

# reloadData

Reloads the rows and sections of the table view.

調用此方法可以重新加載所有建構表的所有數據,包含其 cell、section header、section footer 以及其 index arrays 等等。為了提高效率,TableView 僅重新檢視可見的行。如果表因為重新加載而縮小,它會調整偏移量。

表的 delegate 或 datasource 在當希望表去完整的重新加載數據時調用這個方法。不應該在插入或刪除行的方法中調用,特別是在調用 beginUpdates 和 endUpdates 所實現的動畫區塊中。

重整整個表的數據,並無特別的動畫效果呈現。

# reloadRows & reloadSections

Reloads the specified rows using an animation effect.

這個方法會讓表向它的 datasource 詢問該行新的 cell。它為這個新的 cell 設置進入動畫,也為舊的行設置了相同效果的離開動畫。如果要提示使用者 cell 的值正在改變,請調用此方法。然而,如果提示使用者並不那麼重要,則可以獲取特定行的 cell 並設置其新值。

當在 beginUpdates 和 endUpdates 方法定義的動畫區塊中調用此方法時,它的行為與 deleteRows 類似。UITableView 傳遞給方法的 index 在任何更新之前在表的狀態中指定。無論在動畫塊中的插入、刪除和重新加載的方法調用的順序如何,都會發生這種情況。

如果需要告訴使用者該 cell 的值正在改變,那麼就可以調用此方法。

PS. 這邊有 reloadRows 和 reloadSections 兩種方法,這邊介紹 reloadRows ,因為兩者意思相同,只要把其中的 rows 換成 sections 即可。

# beginUpdates & endUpdates

beginUpdates

Begins a series of method calls that insert, delete, or select rows and sections of the table view.

如果同時要對後續插入、刪除和選擇的操作( 例如:cellForRow & indexPathsForVisibleRows )進行動畫處理,請調用此方法。你還可以使用此方法之後接著使用 endUpdates 方法為行高的改變設置動畫,而不需要重新加載 cell,這組方法必須用 endUpdates 的調用作為結束。這些方法可以嵌套,如果不在該區塊內進行插入、刪除和選擇的調用,那麼行列數等表的屬性可能變為無效。

你不應該在該需組合內調用重新加載( reloadData ),如果你再組合內調用此方法,則必須自己執行所有動畫。

endUpdates

Concludes a series of method calls that insert, delete, select, or reload rows and sections of the table view.

你可以透過調用此方法來包圍以 beginUpdates 為開頭的一系列方法調用,該方法由插入、刪除、選擇和重新加載 TableView 的行和部分操作所組成。當你調用 endUpdates 時,UITableView 將同時為這些操作提供動畫。beginUpdates 和 endUpdates 調用可以被嵌套。如果不在該區塊內進行插入、刪除和選擇的調用,那麼行列數等表的屬性可能變為無效。

# reloadData vs updates

更新數據量

從最簡單的一點來看,應該就是重新加載的數據大小的差異,因為不管我們只更新了其中幾個 cell ,都是重新加載、刷新 TableView 中所有的 cell 的數據。而使用 updates 或是 reloadRows ,我們都可以對指定的 cell 進行更新數據的動作,而不是整個數據重載。

reloadData 就是一種簡單且粗暴的更新數據並刷新 TableView 方式。

更新動畫效果

當我們進行插入或刪除的時候,如果需要有動畫來提示使用者該行被插入或刪除了,那麼這時候我們就要使用這種方式來更新我們的 TableView 了,我們可以在 beginUpdates 與 endUpdates 的區塊內執行插入跟刪除的動作,為這些操作提供動畫效果。

小總結

  • reloadData 帶來了額外的效能問題,也少了提示使用者的新增刪除動畫效果,如果是用在需要讀取整個表而且不需動畫效果的時候,就能使用 reloadData ( 像是 viewDidLoad 時讀取儲存的數據 )。
  • reloadRows 方式必須有生成的 cell 之後才有辦法重新加載,若想更新單一數據的 cell ,則可以使用此方式,也可以添加動畫。
  • updates 方法必須確認插入和刪除的資料數量是否與 row 的數量相等,否則運行時就會報錯。但是此方式可以同時執行區塊內多個插入或刪除的動作,餅且能夠添加動畫效果。如果在區塊內執行 reloadData 動作則動畫效果會失效。

後記

本次介紹 reloadData 與 updates 的介紹就到這邊,希望大家能夠清楚一些,之後會實作一個簡單的待辦事項的 APP 來實作這些效果。

--

--

Jeremy Xue

Hi, I’m Jeremy. [好想工作室 — iOS Developer]