iOS開發- reloadData方法介紹

机械心發表於2024-07-24

在實際開發中,經常需要對tableView或者collectionView執行更新資料來源的操作,reloadData是一個常見的方法。這是 UITableViewUICollectionView 提供的一個方法,用於重新載入檢視的所有可見行(或項)。

當呼叫 reloadData 方法時,UITableViewUICollectionView 會放棄當前顯示的所有Cell並重新請求其資料來源物件以獲取新的Cell。這個過程涉及以下步驟:

  1. 重置UITableViewUICollectionView 會丟棄當前的所有Cell,並準備開始整個檢視的新的佈局過程。

  2. 詢問資料來源:資料來源物件會被詢問新的資料,包括部分數量、每部分的行數(對於 UITableView)或項數(對於 UICollectionView)。

  3. Cell建立或重用:對於檢視中的每一個可見行或項,UITableViewUICollectionView 會透過呼叫資料來源的 tableView:cellForRowAtIndexPath:collectionView:cellForItemAtIndexPath: 方法來獲取一個Cell。如果有可重用的Cell,它會被重用;否則,會建立一個新的Cell。

  4. Cell配置:開發者在資料來源方法中配置Cell,設定必要的資料和檢視。

  5. 顯示Cell:配置好的Cell會被新增到 UITableViewUICollectionView 中,並顯示給使用者。

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已經完成了。

相關文章