在UITableView中延迟加载图像
我有我的UITableView
50个自定义单元格。 我想显示一个图像和一个标签在单元格中,我从URL获取图像。
我想做一个懒惰的图像加载,以便在加载图像时UI不会冻结。 我试图在单独的线程获取图像,但我必须加载每个图像每次细胞变得可见(否则重复使用单元格显示旧图像)。 有人可以告诉我如何复制这种行为。
结帐SDWebImage
自述部分说,如何在你的应用程序中使用它。
苹果有一个很好的官方例子: LazyTableImages我认为你会find正确的方法在那里….
尝试AFNetworking类在这个链接https://github.com/AFNetworking/AFNetworking下载这个类。; 在项目中添加所有的AFNetworking类,然后导入这个类别
#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview.
然后在cellForRowAtIndexPath:如下所示
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if (cell == nil) { cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; }
这会asynchronous地下载你的Image for ImageView在UITableviewcell中 。 当用户滚动Tableview时,它不会一次又一次地下载,因为它也有caching。 一旦你的图像下载它保存imageUrl的关键图像。 我希望它对你有用。
我为此devise了一个免费的图书馆… HJCache。 它非常容易使用。 iphone图像caching
我build议去一个NSOperation,并做任何你需要在另一个线程。
这是我写的图像加载类:
- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url { if(self = [super init]) { if(url == nil || [url isEqualToString:@""]) return nil; target = trgt; action = sel; imgURL = [[NSURL alloc] initWithString: url]; } return self; } - (void)main { [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil]; } - (void)loadImage { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; UIImage *img = [UIImage imageNamed: @"default_user.png"]; if(![[imgURL absoluteString] isEqualToString: @"0"]) { NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; img = [UIImage imageWithData: imgData]; } if([target respondsToSelector: action]) [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; [pool release]; } - (void)dealloc { [imgURL release]; [super dealloc]; }
希望有所帮助!
您也可以尝试EGOImageLoading 。 还有一个演示,演示如何使用它。
你可以使用自我图像button..你可以从github下载自我图像button文件…添加到您的项目….
在你的xib图像视图中更改类“自我形象button”…
懒加载被称为同步请求..
自我形象被称为asynchronous请求。 自我形象不要等待回应..一次显示所有图像..
也许你可以尝试一下ALImageView ,它比SDWebImage简单得多。你只需要两个源文件( ALImageView.h / ALImageView.m )。你可以重新使用图像视图重新加载一个tableview单元格中的不同的URL。
- 支持本地和内存caching;
- 支持占位者;
- 支持点击触摸(目标动作);
- 支持图像视图的angular落;
还有一个很好的演示。
你可以试试这个lazyTableImages ,
我已经定制lazyTableImages这个项目到一个非常简单的( customizeLazyTableImages )和删除所有额外的代码与一些静态url和标题只有这是非常顺利加载图像和caching
我认为还有另一种方法来解决这个问题,如果你想加载的图像,然后在视图的开始意味着什么
当-(void)loadView
加载,然后只是分配这些图像,并把它放入一个nsarray
现在当表格单元nsarray
载,然后使您的视图在表格单元格,并根据indexPath.row
只是将这些图像的nsarray
replace到该视图作为背景图像或使用tableview单元格的nsarray
索引和indexPath.row
在这个新的tablecell视图上对这些图像进行子视图。
您可以使用NSOperation队列或GCD在后台加载图像。
如果您不想一次又一次加载图像,则可以使用NSCache或文件系统来存储图像。
我不知道任何内置的方式来实现这一点,但它听起来像你有一些工作与另一个线程已经。
假设现在你唯一剩下的问题就是当单元格重新回到视图时使内容失效,你应该看看:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
通过实现这个委托方法,你可以在绘制之前检查单元格的内容,看它是否需要新的内容。 如果这样做,那么你可以清空单元格内容并再次触发你的线程加载。
你也可以考虑发布一些代码。
- 文件是通用的(三个切片),但它不包含在iOS上的静态库的(n)ARMv7-s切片错误,无论如何绕过?
- 如何更改UIStackView的背景颜色?
- 如何隐藏UINavigationBar 1px的底线
- 在Xcode 6中进行XCTest和asynchronoustesting
- 边界UITextView
- CLLocationManager startUpdatingLocation不调用locationManager:didUpdateLocations:或locationManager:didFailWithError:
- 定期iOS背景位置更新
- 在iOS5中使用UISegmentedControl切换ViewController
- 如何创buildiphone的摇摆图标效果?