好吧,我得到了与各自含有UITableView其图像正在通过UITableViewCell异步下载定制UIImageViews一个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];
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top