【问题标题】:UITableView asynchronous UIImage settingUITableView 异步 UIImage 设置
【发布时间】:2014-02-25 18:12:19
【问题描述】:

我的目标是设置文本,然后异步调用图像,并在到达时设置图像。

我目前在UITableViewCell 中设置图像的异步调用,并注意到我之前的技术导致了我最近发现的循环:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* cell = [_tableView dequeueReusableCellWithIdentifier:@"id"]; 如果(细胞 == 零){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"id"]; } [NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:userAvatar]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 如果(数据){ UIImage* avatarImage = [UIImage imageWithData:data]; 如果(头像图像){ dispatch_async(dispatch_get_main_queue(), ^{ [cell.imageView setImage:avatarImage]; }); /* .--. [停止] .----''--。 | '-()-----()-' | 如果我包括以下内容, 程序进入一个循环, 并且尚未确定解决方法: dispatch_async(dispatch_get_main_queue(), ^{ [_tableView 重载数据]; }); [走] 。 - 。 | .----''--。 | '-()-----()-' */ } } }]; cell.textLabel.text = @"foo"; cell.detailTextLabel.text = @"bar"; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 返回单元格; }

是否有一种方法可以在没有自定义类中的自定义设置器的情况下产生我正在寻找的结果?

【问题讨论】:

  • 请勿从cellForRow... 致电reloadData。坏事发生。查看 Apple 的 LazyTableImages 示例应用程序,了解如何正确执行此操作。
  • 您也可以使用 AFNetworking 轻松做到这一点 - 检查 UIImageView+AFNetworking.h 的添加。
  • @joao AFNetworking 使用了一种非常简单的方法,基本上“让它工作”,但实际上引入了一个更严重的问题。所以,我不会推荐它。
  • @CouchDeveloper 你能告诉我有什么问题吗?我使用 AFNetworking 已经有一段时间了,从来没有出现过任何奇怪的行为。
  • @joao 简单方法的根本问题是,请求(用于加载图像)可能会快速启动和取消 -取决于用户滚动表格视图的速度。在最坏的情况下,这可以每秒启动数百个请求,这些请求将由 Web 服务完全服务,但随后会被客户端立即取消,客户端永远不会接收数据,也永远不会在本地缓存数据。跨度>

标签: ios objective-c asynchronous uitableview


【解决方案1】:

您绝对不想每次加载图像时都调用-reloadData,它太重了,并且还会导致重新加载所有单元格,这会调用此方法,正如您所发现的那样。

我根本不清楚你为什么要调用-reloadData,因为这应该已经按原样工作了——在单元格的 imageView 上设置图像会导致显示刷新......除了:

此代码中存在很大的逻辑错误,因为单元格一直在重复使用,但是您异步加载图像然后将其设置到特定单元格。无法保证在加载图像时单元格仍会分配到表格的同一行 - 您只是在此时将图像设置在随机单元格上。

一般来说,tableViews 只创建足够多的单元格同时在屏幕上可见,而不是每行一个表格。当您向下滚动表格时,顶部的单元格将被移除并在下方重复使用,以节省内存和创建时间。

不要直接在单元格上设置图像,而是在 tableView 中按其行再次查找单元格(如果它仍然可见)并以这种方式设置。

此外,您不会缓存您获取的图像,这将导致每次用户向下滚动然后再次向上滚动时都会进行新的获取。虽然内置的网络代码会进行某种程度的缓存,但您永远不知道它有多少,而且将HTTP 请求更改为完整图像肯定不会很快,因此您希望自己缓存这些图像,与原始@相关联987654324@ 或行或任何​​唯一标识它们的键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 2013-05-09
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多