3

我正在开发一个 iPhone 应用程序,它从服务器检索照片并将它们呈现在屏幕上,类似于 Pulse News Reader 呈现其文章的方式。我有一个垂直滚动UITableView,每个都UITableViewCell包含自己的自定义UITableView实例,允许用户水平浏览照片。

我目前填充水平滚动表的cellForRowAtIndexPath方式是在垂直滚动表的方法中进行服务器调用。每当一个新单元格进入视图时,我都会发送对该特定单元格照片的请求,如下面的代码所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"EventCell";

    EventViewCell *cell = (EventViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[EventViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Event *event = [self.fetchedResultsController objectAtIndexPath:indexPath];

    [self performPhotoFetchForEventID:event.id inCell:cell withRetries:3];

    return cell;
}

当用户缓慢滚动垂直表格时,此解决方案非常有效,但是如果用户快速滚动或“轻弹”列表,它就会开始崩溃。本质上,如果用户快速滚动浏览 X 事件,应用程序将触发 X 服务器请求并返回所有结果,即使应用程序的视图最多只需要其中三个请求的结果。这有时会导致图片显示在错误的行中,或者显示延迟。

如果用户滚动得太快,我如何防止/取消我的服务器请求。或者有没有更好的方法来实现这个以获得预期的效果?

4

3 回答 3

4

这有时会导致图片显示在错误的行中

在解决问题的其他部分之前,您应该尝试了解为什么会发生这种情况。

根据我的经验,(当然取决于图像的大小),最好从服务器获取图像而不是取消它。虽然你应该记住一些事情:

  • 拥有它后将其缓存,并确保在请求新缓存之前检查您的缓存。您可以使用 aNSDictionary和密钥作为图像的 URL。

  • 异步调用。您不应该使用请求/缓存部分阻塞/强调您的 UI 线程。使用NSOperationsNSOperationQueue创建小型工作人员来处理请求和缓存。一旦你得到它,只需更新你的UIImageView.

  • 在获取图像时留下占位符。这向用户显示正在发生的事情。

  • 更新您的数据源而不是您的单元格。原因是,如果您看到行 [0,1,2,3,4,5] 并且您滚动,现在您看到行 [40,41,42,43,44,45],当响应带有第一行的图像,单元格早已消失(可能是您在错误位置使用图像时遇到的问题)。

  • 最后,因为你提到了 Pulse News,为什么不跟他们学一点呢?使用链接访问他们的工程页面并了解有关下载图像的一些信息。:)

于 2012-11-15T09:34:56.937 回答
0

如果您使用 NSUrlConnection 在延迟加载模式下检索图像,您可以将以下命令发送到连接:

[connection cancel];

这里是苹果文档

于 2012-11-15T09:27:41.723 回答
-1

无论如何,您不应该在每个 cellForRowAtIndexPath: 上创建照片请求。您应该使用异步图像缓存库,其中很少:我使用 JMImageCache。

于 2012-11-15T09:27:36.823 回答