UITableView reloadData的正确方法
2013-10-20 08:43
411 查看
相信很多人会遇到这种情况,当tableView正在滚动的时候,如果reloadData,偶尔发生App crash的情况。 这种情况有时候有,有时候没有,已经难倒了很多人。直至今天,我在stackoverflow上面,仍没有发现真正有说到其本质的帖子。我的处女贴,选择这个问题来阐述一下我的观点。
第一句话,阐述问题的本质:在tableView的dataSource被改变 和 tableView的reloadData被调用之间有个时间差,而正是在这个期间,tableView的delegate方法被调用,如果新的dataSource的count小于原来的dataSource count,crash就很有可能发生了。
下面的笔记提供了两种解决方案,和记录了一个典型的错误,即 在background thread中修改了datasource,虽然调用
记住正确的原则:
总是变化的DataSource和(注意这个和)reloaddata在主线程。更重要的是,reloaddata应该DataSource更改之后立即调用。
如果数据源改变但是TableView的reloaddata方法不立即调用,tableview可能会崩溃,如果它在滚动。
事故原因:有DataSource的变化和reloaddata之间的时间差距仍然是。如果表是滚动在时间上的差距,应用程序可能会崩溃的!!!!
错误的方式:
下面的代码是错误的:即使是在reloaddata主线程调用,有DataSource的变化和reloaddata之间的时间差距仍然是。如果表是滚动在时间上的差距,应用程序可能会崩溃的!!!!
错误代码样本:
正确的代码样本:
第一句话,阐述问题的本质:在tableView的dataSource被改变 和 tableView的reloadData被调用之间有个时间差,而正是在这个期间,tableView的delegate方法被调用,如果新的dataSource的count小于原来的dataSource count,crash就很有可能发生了。
下面的笔记提供了两种解决方案,和记录了一个典型的错误,即 在background thread中修改了datasource,虽然调用
[self.tableView performSelectorOnMainThread: @selector(reloadData) withObject:nilwaitUntilDone:NO];
记住正确的原则:
总是变化的DataSource和(注意这个和)reloaddata在主线程。更重要的是,reloaddata应该DataSource更改之后立即调用。
如果数据源改变但是TableView的reloaddata方法不立即调用,tableview可能会崩溃,如果它在滚动。
事故原因:有DataSource的变化和reloaddata之间的时间差距仍然是。如果表是滚动在时间上的差距,应用程序可能会崩溃的!!!!
错误的方式:
下面的代码是错误的:即使是在reloaddata主线程调用,有DataSource的变化和reloaddata之间的时间差距仍然是。如果表是滚动在时间上的差距,应用程序可能会崩溃的!!!!
错误代码样本:
-(void) changeDatasource_backgroundThread { @autoreleasepool{ [self.dataSourceArray removeAllObjects]; [self.tableView performSelectorOnMainThread: @selector(reloadData) withObject:nil waitUntilDone:NO]; } }
正确的代码样本:
dispatch_async(dispatch_get_main_queue(), ^{ self.dataSourceArray= a new Array. [self.tableView reloadData]; });
相关文章推荐
- UITableView reloadData的正确方法
- UITableView reloadData的正确方法。
- UITableView reloadData的正确方法。请每一个开发者必看。
- UITableView reloadData的正确方法
- UITableView reloadData的正确方法
- UITableView reloadData的正确方法
- 我的处女贴: UITableView reloadData的正确方法。请每一个开发者必看。《转》
- UITableView reloadData后,cellForRowAtIndex方法未调用问题
- UITableView的reloadData方法,不执行cellForRow方法,但是执行了numberOfRows和heightForRow方法
- UITableView的reloadData方法,不执行cellForRow方法,
- 判断UitableView reloadData 结束的方法
- iOS UITableView reloadData 视图漂移或者闪动解决方法
- iOS UITableView reloadData 时视图漂移或者闪动解决方法
- UITableView判断reloadData结束
- iOS11 UITableView reloadData 界面跳动问题
- UITableView reloadData 无效一例
- 关于UITableView reloadData时发生App crash的情况
- tableView之reloadData方法
- UITableView判断reloadData结束(iOS)
- iOS 关于UICollectionView选中状态,当使用reloadData方法时出现数据的问题?