动态加载图像

时间:2011-11-25 17:14:56

标签: ios asynchronous uiscrollview uiimageview lazy-loading

我最近遇到了动态(懒惰)在UIScrollView中放置的元素(UIViewController-Subclasses)中加载图像的问题。

情况如下:

  • 需要以水平滚动的滚动视图显示大量带书库的书籍
  • 由于记忆的限制,我回收了书籍元素;我使用一组30本书实例,并在调用didScroll-Delegate方法时在UIScrollView中重新设置它们的位置。
  • 在重新设置图书元素的框架时,它也会更新新内容(新书信息)
  • 在更新book-element时,book-cover-image淡出,启动一个从web加载图像的线程,一旦完成,将图像设置为UIImageViewController的image属性。

到目前为止这么好,延迟加载效果很好,并且重复使用我的书籍元素也很有用......

问题是只有在UIScrollview完成滚动动画后才会显示异步加载的图像。

我已经尝试过像setNeedsDisplay这样的东西(一旦图片finisehd加载)。但它根本没有帮助......

我向你们提出一些建议......

感谢, 山姆

2 个答案:

答案 0 :(得分:2)

您必须将NSURLConnection设置为在主运行循环上调用其delagate,以便可以更新UI。查看NSURLConnection class reference并搜索:

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode

代码应如下所示:

urlConn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];

[urlConn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

[urlConn start];

在获取图像时将连接运行循环模式设置为 NSRunLoopCommonModes 使代表能够在主运行循环处于UI事件跟踪模式时更新UI,例如,当滚动表视图或滚动视图时。

答案 1 :(得分:0)

您使用的是网络框架吗?

如果不是,我会建议使用AFNetworking。请参阅以下代码:

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];

见这里:

AFNetworking