Swift中调用UICollectionView的reloadData为何不按代码顺序执行?
UICollectionView reloadData 执行顺序不符合预期的原因
你观察到的现象是UIKit的正常设计,并非代码执行顺序错乱,核心原因如下:
reloadData本质是给当前collectionView打了一个「需要刷新」的标记,并不会同步触发数据源、代理方法的调用- 所有UI更新相关的操作默认都会被系统攒到主线程RunLoop的当前循环末尾统一处理,在这之前,当前代码块内的所有同步逻辑会优先执行完,因此你写在
reloadData之后的print会先输出 - 等当前代码块执行完毕、主线程空闲后,系统才会处理之前标记的刷新任务,调用
numberOfItemsInSection、cellForItemAt等数据源方法完成实际的cell渲染和布局
如果你需要刷新完成后再执行后续逻辑,可以用两种方式实现:
- 调用
layoutIfNeeded强制立刻触发布局流程,此时数据源方法会同步执行完再走后续代码
collectionView.reloadData() collectionView.layoutIfNeeded() // 后续代码会在刷新完成后执行 print("1") print("2")
- 将后续逻辑派发到主队列异步执行,会自动等到当前RunLoop的UI刷新任务处理完再调用
collectionView.reloadData() DispatchQueue.main.async { print("1") print("2") }
内容的提问来源于stack exchange,提问作者brandon lee
相关产品推荐
相关产品推荐

