iOS开发- reloadData办法介绍
在实践开发中,常常需求对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现已完结了。