在实际开发中,经常需要对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已经完成了。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容