您的当前位置:首页正文

iOS开发- reloadData方法介绍

2024-10-17 来源:个人技术集锦

在实际开发中,经常需要对tableView或者collectionView执行更新数据源的操作,reloadData是一个常见的方法。这是 UITableView UICollectionView 提供的一个方法,用于重新加载视图的所有可见行(或项)。

当调用 reloadData 方法时, UITableView UICollectionView 会放弃当前显示的所有Cell并重新请求其数据源对象以获取新的Cell。这个过程涉及以下步骤:

  1. 重置 UITableView UICollectionView 会丢弃当前的所有Cell,并准备开始整个视图的新的布局过程。

  2. 询问数据源 :数据源对象会被询问新的数据,包括部分数量、每部分的行数(对于 UITableView )或项数(对于 UICollectionView )。

  3. Cell创建或重用 :对于视图中的每一个可见行或项, UITableView UICollectionView 会通过调用数据源的 tableView:cellForRowAtIndexPath: collectionView:cellForItemAtIndexPath: 方法来获取一个Cell。如果有可重用的Cell,它会被重用;否则,会创建一个新的Cell。

  4. Cell配置 :开发者在数据源方法中配置Cell,设置必要的数据和视图。

  5. 显示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已经完成了。

显示全文