在實際開發中,經常需要對tableView或者collectionView執行更新資料來源的操作,reloadData是一個常見的方法。這是 UITableView
和 UICollectionView
提供的一個方法,用於重新載入檢視的所有可見行(或項)。
當呼叫 reloadData
方法時,UITableView
或 UICollectionView
會放棄當前顯示的所有Cell並重新請求其資料來源物件以獲取新的Cell。這個過程涉及以下步驟:
-
重置:
UITableView
或UICollectionView
會丟棄當前的所有Cell,並準備開始整個檢視的新的佈局過程。 -
詢問資料來源:資料來源物件會被詢問新的資料,包括部分數量、每部分的行數(對於
UITableView
)或項數(對於UICollectionView
)。 -
Cell建立或重用:對於檢視中的每一個可見行或項,
UITableView
或UICollectionView
會透過呼叫資料來源的tableView:cellForRowAtIndexPath:
或collectionView:cellForItemAtIndexPath:
方法來獲取一個Cell。如果有可重用的Cell,它會被重用;否則,會建立一個新的Cell。 -
Cell配置:開發者在資料來源方法中配置Cell,設定必要的資料和檢視。
-
顯示Cell:配置好的Cell會被新增到
UITableView
或UICollectionView
中,並顯示給使用者。
reloadData
方法通常在以下情況下使用:
- 資料來源發生了變化,需要更新整個列表或網格。
- 需要響應某個事件,如使用者操作或網路請求完成,導致資料集更新。
- 初始化或檢視控制器的檢視將要出現時,需要確保資料是最新的。
使用 reloadData
方法的缺點是它會重新載入整個列表或網格,這可能不是效能最優的選擇,特別是當只有資料的一小部分發生變化時。在這種情況下,更細粒度的更新方法(如 insertRowsAtIndexPaths:withRowAnimation:
、deleteRowsAtIndexPaths:withRowAnimation:
、reloadRowsAtIndexPaths:withRowAnimation:
對於 UITableView
,以及對應的 UICollectionView
方法)可能是更好的選擇,因為它們允許只更新改變的部分,而不是整個檢視。
- reloadData是非同步執行的,如果有任務需要在資料載入完畢後再執行,就需要使用dispatch_async,如:
@weakify(self);
dispatch_async(dispatch_get_main_queue(), ^{
@strongify(self);
if (!self) {
return;
}
//需要實現的程式碼
});
但是不一定就會在reloadData完成後執行,因為在這裡使用 dispatch_async 將一個 block 非同步地派發到主佇列。但由於 reloadData 也會在主佇列上非同步執行,這兩個操作是獨立的,並且都被非同步地加入到主佇列中,執行順序取決於它們被加入佇列的時間和佇列的狀態。
如果目的是確保 某一個任務 在 collectionView 完全載入資料後執行,我現在想到的方法是使用使用 dispatch_after:
@weakify(self);
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(100 * NSEC_PER_MSEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
@strongify(self);
if (!self) {
return;
}
//執行任務程式碼
});
當然具體的時間要根據實際情況安排,我這是100ms,基本上reloadData已經完成了。