我已经实现了一个带有更多功能的UITableView. tableView从有时很慢的服务器加载大图像.我正在为每个图像启动一个URLConnection并重新加载对应于URLConnection的indexPath(与连接对象一起保存).连接本身在tableView上调用-reloadData.
现在,当单击加载更多按钮时,我滚动到位置底部的新数据集的第一行.这很好用,也是我的异步加载系统.
我面临以下问题:当连接“太快”时,tableView正在重新加载给定indexPath的数据,而tableView仍然滚动到新数据集的第一个单元格,tableView向后滚动一半的高度细胞.
这应该是它应该是什么样子以及它实际上做了什么:
^^^^^^^^^^^^应该^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^
以下是一些代码:
[[self tableView] beginUpdates]; for (NSMutableDictionary *post in object) { [_dataSource addObject:post]; [[self tableView] insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:[_dataSource indexOfObject:post] inSection:0]] withRowAnimation:UITableViewRowAnimationBottom]; } [[self tableView] endUpdates]; [[self tableView] scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[_dataSource indexOfObject:[object firstObject]] inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
-tableView:cellForRowAtIndexPath:如果数据源数组中的对象是字符串,则启动JWURLConnection,并将其替换为完成块中的UIImage实例.然后它重新加载给定的单元格:
id image = [post objectForKey:@"thumbnail_image"]; if ([image isKindOfClass:[NSString class]]) { JWURLConnection *connection = [JWURLConnection connectionWithGETRequestToURL:[NSURL URLWithString:image] delegate:nil startImmediately:NO]; [connection setFinished:^(NSData *data,NSStringEncoding encoding) { [post setObject:[UIImage imageWithData:data] forKey:@"thumbnail_image"]; [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }]; [cell startLoading]; [connection start]; } else if ([image isKindOfClass:[UIImage class]]) { [cell stopLoading]; [cell setImage:image]; } else { [cell setImage:nil]; }
我可以阻止tableView执行-reloadRowsAtIndexPaths:withRowAnimation:调用直到tableView滚动完成?或者你能想象一个防止这种行为的好方法吗?