异步图像加载的UITableView问题

时间:2009-11-10 20:06:56

标签: iphone asynchronous uitableview

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

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

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

问题是:此时不会出现每个单元格的图像。将表格滚动到底部,单元格#7~完全加载。

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

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

但是使用NSLog(一步一步)找出问题所在,问题是:

  1. cellForRowAtIndexPath调用loadimage方法
  2. 在loadimage方法中,创建了NSURLConnection
  3. NSURLConnection didReceiveData的方法未被调用
  4. 因此,确实调用了loadimage方法。但是没有收到数据。

    滚动到底部然后返回顶部单元格,一切正常。 这个词是WEIRD。

5 个答案:

答案 0 :(得分:1)

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

Implement a kind of white board on Iphone

答案 1 :(得分:1)

查看HJCache,它可以轻松解决这个问题,它可以完全管理异步图像下载,UIImage对象共享以及您可以配置并可以自我清理的文件缓存:HJCache: iPhone cache library for asynchronous image loading and caching

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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