0

如果我们从 Internet 上获取一张小图像(例如 60 x 60),则在方法内部:

-(UITableViewCell *) tableView:(UITableView *) tableView 
                       cellForRowAtIndexPath:(NSIndexPath *)indexPath {  ...  }

如果有固定的 25 行,而长度可以是可变的(例如,100,或者可以是 1000),该怎么办?如果我们使用dequeueReusableCellWithIdentifier“重用”一个单元格,我们可能需要删除该单元格中的子视图(其中一个是 60 x 60 图像),因此当用户上下滚动列表时,单元格会被重用,并且图像是从网上重新获取的,并且在滚动时可以在这里和那里暂停。

但是,如果我删除dequeueReusableCellWithIdentifier并始终分配一个新单元格:

    cell = [[UITableViewCell alloc] 
               initWithStyle:UITableViewCellStyleDefault
               reuseIdentifier:TableViewCellIdentifier];

然后当我再次向下和向上滚动时,NSLog显示图像仍在获取中。如果我们不想单独使用数组来存储获取的图像,有没有办法防止这种情况发生?

(现在,最初的行为是获取大约 7 张图像,如果表格向下滚动 3 行,则获取 3 张图像,如果表格向上滚动 3 行,则再次获取 3 张图像)

4

5 回答 5

2

你应该有一个图像缓存机制。如果图像不存在,请下载该图像。设置一个过期时间,您需要重新获取它。然后显示它。

下次你加载它。您显示已下载的图像并检查到期时间。如果它过期,你再次下载它,并更新显示。

很简单。

唯一复杂的是,下载后应该覆盖图像。我用 GUID 测试这个。当请求图像下载时,我将 UUID 放在 tableview 或图像对象本身中。我还将该 UUID 与下载任务一起发送。当下载返回时,您可以根据显示项目的 UUID 测试下载的 UUID。如果它们相等。然后你更新显示。如果它们已更改,则请求另一个下载并覆盖您的下载。因此,该过程更改了图像,并且具有该 UUID 的下载将很快完成,并将使用其下载的内容更改图像。

希望有帮助:)

于 2012-08-23T01:22:31.503 回答
1

至于暂停滚动视图,您应该在另一个线程上加载您的图像(如果它们没有被缓存或需要根据 DarkAngel 的回答进行更新)。我会使用 NSOperationQueue。 这是关于设置 NSOperationQueue的一个很好的教程。一个好主意是在您的应用程序委托中使用共享队列,您可以在需要时添加任务。

于 2012-08-23T01:57:28.303 回答
1

只需使用 SDWebImage 或 AFNetworking。它们都提供了一个 UIImageView 类别,为您提供缓存机制。

这意味着如果图像下载器库(SDWebImage 或 AFNetworking)在其缓存中找到了图像,那么它只会从磁盘中获取该图像,而不是从网络重新下载图像。

您看到延迟很可能是因为在您的 cellForRowAtIndexPath: 表视图委托方法中,您可能正在使用主线程上的 NSURLConnection 下载缩略图。

SDWebImage 或 AFNetworking 基本上将为您完成所有艰苦的工作并使您的表格响应。你所要做的就是:

[myThumbnailImageView imageWithURL:imageURL placeholder:[UIImage imageNamed:@"myPlaceholderImage.png"]];

一旦你把那条线放进去,就是这样。您的真实图像将在下载后出现,在此之前您可以继续平滑滚动表格视图。当图像尚未下载时,每个单元格将显示您指定的占位符图像(参见上面的代码行)。

于 2012-08-23T04:22:44.980 回答
1

您可以使用 Volure 提到的图像缓存。我还建议您为这些图像实施某种形式的延迟加载。为此有许多不同的实现。本项目是 UIImageView 的子类,支持异步加载。

另外,看看这个问题,答案可能会有所帮助。

希望这可以帮助。

于 2012-08-23T01:42:40.117 回答
0

为了更方便下载图像,请使用 EGOImageLoader/EGOImageView 通过此链接https://github.com/enormego/EGOImageLoading下载此类。

从此 EGOCache 用于存储您的图像。第一次下载时,在滚动 UITableview 时从 EGOCache 存储中获取图像。在该类中,它使用密钥存储下载的图像。关键是您的 imageUrl 的散列值。使用相同的键从缓存中检索图像。泰米拉桑

于 2013-10-23T07:21:59.310 回答