UITableView的 reloadData 與reloadSections 熔任、reloadRowsAtIndexPaths: 的區(qū)別
1. 復(fù)用規(guī)則不一樣
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation API_AVAILABLE(ios(3.0));
- 當(dāng)調(diào)用
[tableview reloadData]
的時(shí)候泽本,當(dāng)前展示的cell
是可以復(fù)用的。但是調(diào)用reloadSection
和reloadRowsAtIndexPaths:
時(shí)候,當(dāng)前的cell
是不能復(fù)用的,會(huì)再創(chuàng)建一個(gè)或者多個(gè)出來品腹,用來展示。創(chuàng)建出來以后押蚤,再執(zhí)行reloadSection
和reloadRowsAtIndexPaths:
的時(shí)候cell
就能復(fù)用了
所以,使用
reloadSection
或reloadRowsAtIndexPaths:
時(shí)抢韭,需要注意显熏,重新創(chuàng)建的cell
上的某些屬性可能會(huì)發(fā)生改變榕莺,導(dǎo)致一些錯(cuò)誤
例:CellA 如果此時(shí)是 firstResponder, 用后2者刷新時(shí)俐芯,會(huì)創(chuàng)建新的cellA' , 此時(shí)CellA 被新的 CellA'替換掉棵介,firstResponder消失钉鸯,會(huì)發(fā)生鍵盤消失的錯(cuò)誤
2. 性能比較
- 簡單列表,在數(shù)據(jù)源變化不大的情況下邮辽,reloadSection和reloadData兩者在時(shí)間唠雕、CPU、內(nèi)存相差并不大吨述,甚至在某些情況岩睁,reloadData性能要優(yōu)于reloadSection
思考:既然這樣,為什么還要用 reloadSection呢揣云?
例子考慮的是數(shù)據(jù)源不變的情況下cell的重繪制
但復(fù)雜場景捕儒,之所以考慮部分刷新reloadSections,是因?yàn)樗⑿旅總€(gè)section,cell不單單是cell的繪制邓夕,也都有包含I/O和運(yùn)算操作
而這個(gè)時(shí)候 reloadData會(huì)觸發(fā)其他不必要的運(yùn)算和I/O
UITableview的主要作用是展示數(shù)據(jù)刘莹,而I/O操作其實(shí)不適合放在cell中。
更好的方法是:將獲取數(shù)據(jù)源的代碼放到次要線程中焚刚,這樣主線程才能更好的加載視圖点弯。
我們常用的MVC,MVVM[架構(gòu)]是為了將業(yè)務(wù)邏輯與視圖盡量剝離矿咕,讓UI更好的展示數(shù)據(jù)抢肛。