现在,当单击加载更多按钮时,我滚动到位置底部的新数据集的第一行.这很好用,也是我的异步加载系统.
我面临以下问题:当连接“太快”时,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滚动完成?或者你能想象一个防止这种行为的好方法吗?
解决方法
-performSelector:withObject:afterDelay:延迟为0.0秒不会立即执行给定的选择器,而是在当前的Runloop Cycle结束后和给定的延迟之后执行它.
-performSelector:withObject:添加到当前Runloop循环中并执行.这与直接调用该方法相同.
因此,使用-performSelector:withObject:afterDelay:UI将在当前的Runloop Cycle中更新,即在这种情况下滚动动画可以在执行选择器之前完成(并再次重新加载UI).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。