[tableView reloadData] 和 runloop
需要[tableView reloadData]后需要立即获取tableview的cell、高度,或者需要滚动tableview,那么,直接在reloadData后执行代码是会有问题的。
断点调试感觉[tableview reloaddata]是个异步操作导致下面的代码并不会再它执行完后才执行。
于是就想到了多线程,最简单使用动画来延迟执行
[UIView animateWithDuration:0.3 animations:^{
[self.collectionView reloadData];
} completion:^(BOOL finished) {
[self.collectionView setContentOffset:offset animated:NO];
}];
解决是解决了,但是感觉有特别明显的动画效果还是去查了资料才知道是runloop的原因而不是异步问题
大神解说是因为[tableview reloaddata] 需要在当前方法在runloop中执行完后它再在runloop中执行,处理函数是在runloop中串行的排队执行的。但是[tableview reloaddata]后面的代码需要[tableview reloaddata]的计算结果,所以[tableview reloaddata]后面的代码需要一个延迟执行。只有当前方法不再占用runloop,[tableview reloaddata]才可以在runloop中执行,而这时延迟执行的部分在runloop中早就排在了[tableview reloaddata]的前面执行完了。如果表中的数据非常大,在一个runloop周期没执行完,这时,需要tableview视图数据的操作就会出问题了。apple并没有直接提供reloadData的api,想要程序延迟到reloadData结束再操作,可以用以下方法
方法1:layoutIfNeeded会强制重绘并等待完成
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
//刷新完成
方法2:
reloadData会在主队列执行,而dispatch_get_main_queue会等待机会,直到主队列空闲才执行。
[self.collectionView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
// 刷新完成
[self.collectionView setContentOffset:offset animated:NO];
});
}
[tableView reloadData] 和 runloop的更多相关文章
- iOS 解决TableView reloadData时cell中图片会闪的问题
tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...
- tableView reloadData页面跳动问题
参考:https://www.jianshu.com/p/5f033fdd4ddb 一般情况下 if (@available(iOS 11.0, *)) { self.estimatedRowHeig ...
- tableview的reloadData应注意
http://blog.csdn.net/ouyangtianhan/article/details/7835041 http://stackoverflow.com/questions/160715 ...
- 【Swift】Alamofile网络请求数据更新TableView的坑
写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的 ...
- 深入理解RunLoop
网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/ ...
- 自定义刷新tableView
// // LSTWholeTableController.m // BUDEJIE // // Created by admin on 16/8/17. // Copyright © 201 ...
- 使用MJRefresh遇到的一个问题,上拉刷新后tableview瞬间滑到最底部
最近用MJRefresh上拉刷新时遇到一个问题,就是上拉刷新后,tableview会瞬间滑到最底部,用户还要往回翻才能看到新刷出来的数据,体验十分不好.查了很久没找到原因,最后发现在refreshvi ...
- IOS tableview下拉刷新上拉加载分页
http://code4app.com/ios/快速集成下拉上拉刷新/52326ce26803fabc46000000 刷新没用用插件,加载使用的MJ老师的插件. - (void)viewDidLoa ...
- 浅谈Runloop
RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...
随机推荐
- BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9812 Solved: 3978[Submit][St ...
- 我的MYSQL学习心得(十三) 权限管理
我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...
- Speedment -- 利用lambda编写SQL
众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...
- 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧
之前一篇<工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)!> 看到很多朋友回复和支持,非常感谢,尤其是一些拍砖的喷油,感谢你们的批评,受益良多. 我第一份工作便是W ...
- Hadoop相关日常操作
1.Hive相关 脚本导数据,并设置运行队列 bin/beeline -u 'url' --outputformat=tsv -e "set mapreduce.job.queuename= ...
- 使用注解匹配Spring Aop切点表达式
Spring中的类基本都会标注解,所以使用注解匹配切点可以满足绝大部分需求 主要使用@within()/@target @annotaton() @args()等... 匹配@Service类中的所有 ...
- T-SQL检查停止的复制作业代理,并启动
有时候搭建的复制在作业比较多的时候,会因为某些情况导致代理停止或出错,如果分发代理时间停止稍微过长可能导致复制延期,从而需要从新初始化复制,带来问题.因此我写了一个脚本定期检查处于停止状态的分 ...
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- 【CSS进阶】CSS 颜色体系详解
说到 CSS 颜色,相比大家都不会陌生,本文是我个人对 CSS 颜色体系的一个系统总结与学习,分享给大家. 先用一张图直观的感受一下与 CSS 颜色相关大概覆盖了哪些内容. 接下来的行文内容大概会按照 ...