uicollectionview 中的延迟加载
Posted
技术标签:
【中文标题】uicollectionview 中的延迟加载【英文标题】:Lazy loading in uicollectionview 【发布时间】:2015-03-23 07:12:16 【问题描述】:这是我的 collectionview 的代码,它显示记录但加载真的请告诉我如何在此实现延迟加载,我的项目中也有一个占位符图片
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];
// Setup image name
NSString *url = [[rssOutputData objectAtIndex:indexPath.row]xmllink];
UIImage *img = nil;
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
img = [[UIImage alloc] initWithData:data];
cell.MJImageView.image = img;
return cell;
现在它正在工作,但非常非常慢。
【问题讨论】:
使用 SDWebImage 或 AsyncImageView 快速异步加载图像。 异步加载图片。否则 UI 线程必须等待图像被下载。这就是为什么它很慢。 这是我的观点。我将如何做到这一点如何将任何技术应用于我的代码?你能通过我的代码解释一下吗! 请不要使用 Mr Phuc 87 代码!寻找 azat92 答案。并且名称变量以小写字符开头。 【参考方案1】:使用 GCD 进行延迟加载非常容易。
// Create a queue for the operations
dispatch_queue_t queue = dispatch_queue_create("photoList", NULL);
// Start getting the data in the background
dispatch_async(queue, ^
NSData* photoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:object.photoURL]];
UIImage* image = [UIImage imageWithData:photoData];
// Once we get the data, update the UI on the main thread
dispatch_sync(dispatch_get_main_queue(), ^
cell.photoImageView.image = image;
);
);
【讨论】:
【参考方案2】:最简单的实现方法是使用SDWebImage 库,它可以满足您的需求。有UIImageView
类别允许您修改代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];
// Setup image name
NSString *url = [[rssOutputData objectAtIndex:indexPath.row]xmllink];
[cell.MJImageView sd_setImageWithURL:[NSURL URLWithString:url]];
return cell;
【讨论】:
【参考方案3】:NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: @"url.com"]];
UIActivityIndicatorView * indicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[yourImageView addSubview:indicator];
indicator.center = yourImageView.center;
[indicator startAnimating];
[yourImageView setImageWithURLRequest:request
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
dispatch_async(dispatch_get_main_queue(), ^(void)
yourImageView.image = image;
);
[indicator stopAnimating];
[indicator removeFromSuperview];
failure:nil];
【讨论】:
可能值得一提的是,这种方法适用于AFNetworking。【参考方案4】:也许是因为你的图片太大了 您可以使用 NSThread 进行加载
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
CollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MJCell" forIndexPath:indexPath];
cell.tag = indexPath.row; //For index
[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:cell];
return cell;
- (void) loadImage:(CollectionViewCell *)cell
NSString *url = [[rssOutputData objectAtIndex:cell.tag]xmllink];
UIImage *img = nil;
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
img = [[UIImage alloc] initWithData:data];
cell.MJImageView.image = img;
【讨论】:
感谢它的工作,但条目不断从一个单元格切换到另一个单元格! 如果图像不可用或尚未加载,我该如何使用占位符图像 在collectionView:cellForItemAtIndexPath:上,可以设置一个默认图片'invailable',当线程加载完图片后,新的图片会替换掉。 请不要使用此代码!加载到主队列时必须设置图像!!寻找@azat92 的答案。SDWebImage
还允许您在使用集合视图时提高性能。 E.c.:重用单元格时取消图像加载。还有SDWebImage
自动缓存图片,准备在后台队列中显示。以上是关于uicollectionview 中的延迟加载的主要内容,如果未能解决你的问题,请参考以下文章
使用 SDWebImageManager 在 UICollectionView 中延迟加载图像
将图像从 Parse 加载到 UICollectionView 单元格没有延迟