需要[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的更多相关文章

  1. iOS 解决TableView reloadData时cell中图片会闪的问题

    tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...

  2. tableView reloadData页面跳动问题

    参考:https://www.jianshu.com/p/5f033fdd4ddb 一般情况下 if (@available(iOS 11.0, *)) { self.estimatedRowHeig ...

  3. tableview的reloadData应注意

    http://blog.csdn.net/ouyangtianhan/article/details/7835041 http://stackoverflow.com/questions/160715 ...

  4. 【Swift】Alamofile网络请求数据更新TableView的坑

    写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的 ...

  5. 深入理解RunLoop

    网上看的一篇文章,写的真好,我得多看几次好好理解理解 膜拜大神,转载至此便于学习查看. 此处标明原文链接:http://blog.ibireme.com/2015/05/18/runloop/    ...

  6. 自定义刷新tableView

    // //  LSTWholeTableController.m //  BUDEJIE // //  Created by admin on 16/8/17. //  Copyright © 201 ...

  7. 使用MJRefresh遇到的一个问题,上拉刷新后tableview瞬间滑到最底部

    最近用MJRefresh上拉刷新时遇到一个问题,就是上拉刷新后,tableview会瞬间滑到最底部,用户还要往回翻才能看到新刷出来的数据,体验十分不好.查了很久没找到原因,最后发现在refreshvi ...

  8. IOS tableview下拉刷新上拉加载分页

    http://code4app.com/ios/快速集成下拉上拉刷新/52326ce26803fabc46000000 刷新没用用插件,加载使用的MJ老师的插件. - (void)viewDidLoa ...

  9. 浅谈Runloop

    RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何 ...

随机推荐

  1. 用Taurus.MVC 做个企业站(下)

    前言: 上一篇完成了首页,这一篇就把剩下的几个功能给作了吧. 包括文章列表.文章详情和产品展示. 1:文章列表: 原来的ArticleList.aspx 1:现在的articlelist.html 除 ...

  2. 我写的一些前端开源项目(均托管到github)

    大部分项目都是平时项目用到的某些功能,觉得有趣或者复用性有点高就提取成一个单独项目来做维护 coffee-tmpl : 一个极简的模板引擎和ejs及underscore的template类似 turn ...

  3. 使用R画地图数据

    用R画地图数据 首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf.bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下. ...

  4. ASP.NET MVC Bundle使用 合并压缩

    2017-01-06 更新 在 BundleCollection 的构造函数中添加了 3种默认规则 public BundleCollection() { BundleCollection.AddDe ...

  5. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  6. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  7. 读书笔记--SQL必知必会05--高级数据过滤

    5.1 组合使用WHERE子句 操作符(operator)也称为逻辑操作符(logical operator),用来联结或改变WHERE子句中的过滤条件. 5.1.1 AND操作符 在WHERE子句中 ...

  8. The Road To Hadoop(网盘系统的实现)

    因为毕业设计的原因,得从零开始学习hadoop.虽然接触Hadoop也有一段时间了,但是没有一个完整的时间段去学习,在公司实习的同时,只能利用零零碎碎的时间学习,今天完成了第一个版本的基于Hadoop ...

  9. 使用session页面控制登录入口及购物车效果的实现

          由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...

  10. 学会用bootstrap的modal和carousel

    bootstrap框架提供了很多好用的javascript组件,可以很方便的实现常用的js效果,比如点击弹出一个div(modal).下拉菜单.旋转木马(carousel或slider),非常适合前端 ...