##やりたかったこと:例
// UITableViewのdataSourceを変更する
……
// dataSource変更後のNSIndexPathを作成する
[NSIndexPath indexPathForRow:row inSection:section];
// 新しいdataSourceに反映させたあとでスクロールさせたい
[_tableView reloadData]
[_tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
でやってしまうと、scrollToRowAtIndexPathが呼ばれるときは
reloadDataが完了される前のdataSourceで実行されてしまう。
だからといってNSThreadで待ったり、フラグだNotificationだするのはナンセンス
##解決方法:UITableViewの拡張
@implementation UITableView (UITableViewAddition)
-(void)reloadDataAndWait:(void(^)(void))waitBlock {
[self reloadData];
if(waitBlock){
waitBlock();
}
}
@end
##使用方法:例
NSLog(@"numberofsection%d",_tableView.numberOfSections);
[_tableView reloadDataAndWait:^{
NSLog(@"numberofsection%d",_tableView.numberOfSections);
[_tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}];
ちゃんとreload後に処理されていることがわかる。
参考にしたURL
http://stackoverflow.com/questions/15218861/call-function-only-after-reloaddata-has-finished