iOS:如何在UITableView调用reloadData刷新结束后再同步执行后续操作

公開日: 2020-01-04 20:22 246文字 2 min read

前端项目通过bridge获取客户端资源,客户端直接返回response对象为 UIControl 实现线程安全的 Block 事件扩展:原理与实践高数概念、公式、定理常用代码模板2——数据结构常用代码模板1——基础算法iOS:特殊符号大全SwiftUI基本控件《什么是数学 》习题 第一章 补充《什么是数学 》习题 第一章 2 数系的无限性 数学归纳法《什么是数学 》习题 第一章 1 整数的计算LeetCode 70 爬楼梯(青蛙跳台阶)Swift Module 如何被全局引用LeetCode 398 随机数索引Vue 的一些指令和缩写LeetCode 486 Predict the Winner(预测赢家)浅谈iOS中的weakCocoaPods组件化——OC/Swift动静态库混用当对象接收到不能处理的消息时调用的方法iOS:如何在UITableView调用reloadData刷新结束后再同步执行后续操作统计iOS工程代码行数LeetCode 6 ZigZag Conversion(Z字转换)LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal(由中序和后序遍历建立二叉树)LeetCode 5 Longest Palindromic Substring(最长回文字串)LeetCode 8 String to Integer (atoi)Objective-C Type EncodingsObjective-C:为什么分类中不能直接添加属性数据结构与算法解析习题2.23数据结构与算法解析习题2.19数据结构与算法解析习题2.16数据结构与算法解析习题2.14数据结构与算法解析习题2.13数据结构与算法解析习题2.12数据结构与算法解析习题2.11:二分查找数据结构与算法解析习题2.10:霍纳法则(Horner's rule)数据结构与算法解析习题2.7数据结构与算法解析习题1.3数据结构与算法解析习题1.2数据结构与算法解析习题1.1UIButton扩大点击范围以及关于响应者链条的思考UILabel中文带行间距的处理,限制行数,计算高度等UITableview调用reload方法时抖动问题iOS 截取整个 scrollview 图片objc源码分析-runtime-classiOS自动化埋点的实现iOS平台编译Ogre游戏引擎库iPhone 刘海机型UI适配(X、Xs、Xs Max、Xr)iOS 沙盒与 BundleCOCOAPODS技巧-创建私有仓库iOS脚本打包 ipa(.app转.ipa)Objective-C 中禁止调用指定的方法iOS 关于 UITextField 的字数限制iOS 框架学习-AsyncSocketOC优缺点以及常见bugUIViewController 的生命周期runtime——运行时简单使用iPhone6 Plus上面神秘的缝隙UIApplicationiOS 网络小结NSString的各种处理OC中nil 、NULL、 Nil 、NSNull的区别iOS常用数据类型转换关于NSNotificationCenterDescription方法和NSLog函数OC单例宏Block in Objective-CObjective-C 语法 3Objective-C 语法 2Objective-C 语法 1
この投稿は「日本語」では表示できません。元の投稿を表示しています。
调用[tableView reloadData]时,系统并不会等待tableview更新结束后才执行后续代码,而是立即执行后续代码,然后异步地去计算scrollView的高度,获取cell等等。 但是我们又经常需要在tableview刷新结束后同步的执行某些操作,这个是一个隐藏的小坑,有时候稍不注意

调用[tableView reloadData]时,系统并不会等待tableview更新结束后才执行后续代码,而是立即执行后续代码,然后异步地去计算scrollView的高度,获取cell等等。

但是我们又经常需要在tableview刷新结束后同步的执行某些操作,这个是一个隐藏的小坑,有时候稍不注意,就会写出来点Bug,这次有不小心遇到这个问题了,遂在此记录一下。

Apple并没有直接提供reloadData结束时的回调api,那么想要程序代码延迟到reloadData结束后再操作,可以通过以下两个方法来实现:

1. 通过layoutIfNeeded方法,强制重绘并等待完成。

[self.tableView reloadData]; 

[self.tableView layoutIfNeeded];  // 刷新完成,执行后续需要执行的代码

2.reloadData方法会在主线程执行,通过GCD,使后续操作排队在reloadData后面执行。

[self.tableView reloadData]; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    //刷新完成,执行后续代码
});