异步图像加载UITableView问题

问题描述:

所以这是我的问题: 我有一个UITableView自定义UITableViewCells。每个单元格都有一个UIImageView,它使用异步图像加载下载远程图像。异步图像加载UITableView问题

它几乎完美的工作,但我有这个奇怪的问题。

当视图加载时,我可以看到没有滚动的5个或6个第一个单元格(iPhone的显示高度)。

问题是:这时每个单元的图像都不会出现。将表格滚动到底部,单元#7〜end完美加载。

WEIRD的事实是:当我回滚到顶端时,现在5或6个单元格完美加载。

我的第一个想法是:加载视图时,cellForRowAtIndexPath方法在用户交互后不会自动为第一个单元调用loadimage方法。

但使用的NSLog(一步一步)找到问题出在哪里,事情是:

  1. 的cellForRowAtIndexPath调用的LoadImage方法
  2. 内的LoadImage方法,创建NSURLConnection的
  3. NSURLConnection的didReceiveData的方法不被称为

所以,实际上调用loadimage方法。但没有收到数据。

滚动到底部,然后返回到顶部单元格,这都没关系。 这个词是WEIRD。

你说NSURLConnection是创建的,但你永远不会说它开始。确保您要么调用启动连接的方法之一(initWithRequest:delegate:startImmediately:start)。

如果这不是你的问题,那么你可以检查是否有任何其他NSURLConnection委托方法被调用?请特别注意connection:didFailWithError:,因为在连接工作之前可能会出现一些奇怪的网络启动过程,导致它们在第一次加载时失败,但不会在以后出现。

最后,当您发送表格视图reloadData消息时,可以检查它是否有效吗?像[tableView performSelector:@selector(reloadData) withObject:nil afterDelay:1.0];之类的东西,以便它在等待一秒后重新加载。

您可以尝试使用我的JImage对象,它与UIImageView完全相同,但它传递的是URL而不是文件路径。当图像加载(完全异步)时,会显示一个活动指示器。像使用UIImageView一样使用它,但使用URL初始化它。

Implement a kind of white board on Iphone

最可能的解释是,异步调用的时间过长;如果它在绘制单元格之前没有返回,则您的单元格将在没有绘制它的情况下绘制,并且不会重绘,直到从屏幕上滚动并重新打开。

您可以在您的单元格第一次绘制之前同步加载图像(这可能不是您想要的,因为这会损害UI响应性),或者您可以在connectionDidFinishLoading:handler中添加一些代码,将该表标记为需要重新显示刚刚加载的图像的单元格。

谢谢Tim,Skirwan和Dutchie! 我发现了这个问题。现在很明显,omg! 我只是看错了地方!

UITableView的数据来自XML。解析它之后,我调用reloadData。 我之前没有看到这个过程的所有方法都在NSAutoreleasePool中处理。所以,当它完成时(非常快),所有消失(并且NSURLConnection没有足够的时间来加载图像)。

退房HJCache,它是由以使这个问题很容易,它提供了 - 异步镜像下载,UIImage对象共享和文件缓存的全程管理,你可以配置,并可以自我清洁起来:HJCache: iPhone cache library for asynchronous image loading and caching