在UITableView的延迟渲染的UIImageView
-
11-09-2019 - |
题
好吧,我得到了与各自含有UITableView
其图像正在通过UITableViewCell
异步下载定制UIImageView
s一个NSURLConnection
。所有漂亮的标准的东西......
的问题是,当表滚动时,新的图像被正确地但不呈现,直到表中的后台下载停止移动。
我如何获得表来呈现它的内容,即使它的移动? 感谢。
- UPDATE -
在仔细一看,我发现了NSURLConnection
委托方法不是射击,直到表停止滚动。不知道为什么。任何帮助将是巨大的。
解决方案
连接委托消息没有射击,直到你停止滚动的原因是因为在滚动过程中,运行循环是在UITrackingRunLoopMode
。默认情况下,NSURLConnection
安排其自身在NSDefaultRunLoopMode
而已,所以你没有得到任何消息,同时滚动。
下面是如何安排在“公共”模式的连接,其中包括UITrackingRunLoopMode
:
NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSRunLoopCommonModes];
[connection start];
请注意,你必须在初始化,这似乎有悖于苹果的文档表明您可以更改它已经开始,即使后运行循环模式,以指定startImmediately:NO
。
其他提示
您应该NSRunLoop阅读起来。我怀疑,在滚动过程中,运行循环在NSEventTrackingRunLoopMode运行,并且不包括在该模式的NSURLConnection的。你也许可以解决这个问题通过调用NSURLConnection的的scheduleInRunLoop:forMode :,以便下载可以在滚动过程中发生
这可能会影响性能的滚动,这可能是用于在第一位置分开的运行循环模式的原因。但尝试一下,看看感觉如何!
如果你换你的图像下载和更新在的NSOperation,更新将发生的表视图滚动。
的NSOperation的另一个好处,是作为细胞下滑离屏可以取消该操作。它会感觉很多更加适应用户..特别是如果他们快速滚动一个长长的清单。苹果高科技通话今年鼓励这种技术。
如果您的名单并不长,或者您希望他们继续加载,你可以操纵的NSOperation优先吧。
首先...您的连接可能甚至没有开始,直到它得到的对mainRunLoop而这也正是也正在处理的滚动动画。
我遇到了同样的问题,并通过告诉连接的图像,以在创建时立即开始固定它。
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];
[connection start];
在其中收到图像和cell.imageView.image设置为接收到的图像完成例程,你应该检查,以查看是否该小区属于当前正被显示在表中的小区之一...如果所以调用[的tableView reloadData]。
NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage
NSArray *indicies = [_tableView indexPathsForVisibleRows];
NSUInteger rows = indicies.count;
if (rows > 0 &&
itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
{
[_tableView reloadData];
}