[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];
    });
}
时间: 2024-10-10 14:48:24

[tableView reloadData] 和 runloop的相关文章

在textFieldShouldEndEditing 方法中调用[self.tableView reloadData] 失效问题

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField { NSString *value = [NSString stringWithFormat:@"%.2f", [textField.text floatValue]]; if ([value floatValue] >= 1) { textField.text = value; [self calculateServiceFees]; } else { self

tableView reloadData页面跳动问题

参考:https://www.jianshu.com/p/5f033fdd4ddb 一般情况下 if (@available(iOS 11.0, *)) { self.estimatedRowHeight = 0; self.estimatedSectionFooterHeight = 0; self.estimatedSectionHeaderHeight = 0; self.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAd

TableView  — reloadData     刷新

//指定刷新某一行    NSIndexPath *indexPath=[NSIndexPath indexPathForRow:0 inSection:1]; [_readTableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationNone]; //指定刷新某一段 NSIndexSet *indexSet=[[NSIndexS

tableview的reloadData应注意

http://blog.csdn.net/ouyangtianhan/article/details/7835041 http://stackoverflow.com/questions/16071503/how-to-tell-when-uitableview-has-completed-reloaddata UITableView reloadData的正确方法. 相信很多人会遇到这种情况,当tableView正在滚动的时候,如果reloadData,偶尔发生App crash的情况. 这种

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

写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的回答, 而唯一几个比较接近答案的,说要 self.tableView.reloadData(),也没有贴上代码,说要放在哪个函数内, 都犹抱琵琶半遮面,让初学者自己采坑,于是郁闷了一下午,刚刚回到家,试想想,要不试试英文网,毕竟Swift就是人家老外的, 说不定老外会告诉你,怎么取得数据并绑定Tab

iOS:CoreData数据库的使用三(数据库和tableView表格一起使用)

CoreData数据库是用来持久性存储数据的,那么,我们再从该数据库中取出数据干什么呢?明显的是为了对数据做操作,这个过程中可以将它们直观的显示出来,即通过表格的形式显示出来.CoreData配合tableView一起使用,是很常用的一种方式,直观.清晰明了. 下面就来具体的举个例子: 要求:将数据库中的数据显示在表格中,并且可以进行删除.插入等一些操作. 前期的具体步骤: 1.创建项目时,勾选Use Core Data,生成CoreData_____.xcdatamodel文件: 2.点击Co

tableview 删除cell

正如在以前的帖子说,但是我在转到故事版(StoryBoard)教程之前,我有另外一个问题来回答. 我如何从UITableView删除一行呢? 当人们构建简单的表视图引用程序后,这是另一个常见的??问题.同样的,它比你想象的更容易.但在进入编码部分,我打算给你介绍一个程序员使用最多的设计模式,用户界面??编程的模型 - 视图 - 控制器模式(Model-View-Controller). 如果你是认真对待iOS编程的话,你无法逃避学习模型 - 视图 - 控制器(MVC).除了iOS编程,MVC也常

iOS Tableview侧滑删除和移动cell的实现

慕课网上学习了tableview的使用,突然让我觉得iOS比android简单多了,可能是我的感觉吧.因为android实现list view侧拉删除,动态移动item过程还是稍微有点复杂的.但是iOS却只需要重写几个方法就可以实现了.我只能说iOS太神奇!我就跟着做了一下. 项目地址:Todo 看效果,UI还可以.先上storyboard结构图: navigate controller 实现一个导航栏.view controller 实现一个tableview,tableviewCell .

一个tableview的自带动画

最近在实习,这是最近老师叫做的项目里面的一个东西,先以为很难,做了很久也没做出来,后面老师讲了之后发现其实很简单,现在分享上来给大家. 说一下他的主要逻辑,其实就是设置了几个section ,section的headview需要自定义..存了几个字典在datasoure(也就是一个数组当中).字典里面有个bool值判断是否展开section,也就是是否添加cell进section里面.添加进去的时候tableview自带了动画所以看起来就跟上面一样了.删除同理,只是把cell移除了而已.逻辑真的