【发布时间】:2011-09-23 08:51:56
【问题描述】:
可能重复:
Get notified when UITableView has finished asking for data?
是否可以在 tableview 完成 reloadData 方法后重新加载其数据时收到通知?还是可以等到tableview完成重新加载?
谢谢
【问题讨论】:
标签: objective-c multithreading uitableview tableview
可能重复:
Get notified when UITableView has finished asking for data?
是否可以在 tableview 完成 reloadData 方法后重新加载其数据时收到通知?还是可以等到tableview完成重新加载?
谢谢
【问题讨论】:
标签: objective-c multithreading uitableview tableview
有一个非常简单的解决方案是检查你是否在委托的最后一次迭代中
-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
在最后一次迭代完成后添加你的代码
-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if([indexPath row] == lastRow){
any code you want
}
}
谢谢
【讨论】:
UITableView 的文档,当reloadData 被调用时,“表格视图只重新显示那些可见的行”。所以有可能tableView:willDisplayCell: 不会在最后一行被调用。 2)即使与这个问题无关,如果表格视图有页脚,它可能会在单元格加载后加载。此外,reloadData 在加载页脚后可能会做更多的事情,在这种情况下,我们不会确切地知道 reloadData 何时完成。
让我们放入一个完成块。谁不喜欢一个块?
@interface DUTableView : UITableView
- (void) reloadDataWithCompletion:( void (^) (void) )completionBlock;
@end
还有……
#import "DUTableView.h"
@implementation DUTableView
- (void) reloadDataWithCompletion:( void (^) (void) )completionBlock {
[super reloadData];
if(completionBlock) {
completionBlock();
}
}
@end
用法:
[self.tableView reloadDataWithCompletion:^{
//do your stuff here
}];
编辑:
请注意,以上只是解决方案的一半。部分和行数以及行高在主线程上同步更新,所以使用上面的代码,完成会在一些 UI 部分完成时回调。但是从数据源加载数据是异步的——所以这个答案真的不是@Michal 想要的。
【讨论】:
reloadData 完成一样的问题吗?问题是表的更新是异步发生的,并且会在[super reloadData] 完成后继续。