我将UIImageView
子类化为异步加载图像,不会影响UICollectionView
滚动性能。虽然这确实有效,但它会流畅地滚动并且图像不会重复,每次用户向上或向下滚动时都会getDataInBackgroundWithBlock
。我想知道它是否可能只加载一次图像而没有一个恒定的调用来滚动时获取数据。我正在使用Parse作为数据库。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
albumImageCell *cell = (albumImageCell *) [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[albumImageCell alloc]init];
}
PFObject *temp = [_dataArray objectAtIndex:indexPath.row];
PFFile *file = [temp objectForKey:@"imageThumbnail"];
[cell.imageView setFile:file];
return cell;
}
自定义ImageView -
- (void) setFile:(PFFile *)file {
NSString *requestURL = file.url; // Save copy of url locally (will not change in block)
[self setUrl:file.url]; // Save copy of url on the instance
self.image = nil;
[file getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
NSLog(@"GETTING DATA AGAIN");
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
//Background Thread
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^(void){
//UI Updates
if ([requestURL isEqualToString:self.url]) {
[self setImage:image];
[self setNeedsDisplay];
}
});
});
} else {
NSLog(@"Error on fetching file");
}
}];
}
可能是preparseForReuse
中的某些内容?我也试过像if(image == nil)
这样的东西,然后加载数据,但不起作用。
答案 0 :(得分:0)
我强烈建议您将SDWebImage
用于此目的。它是一个防弹库,负责下载和缓存网页图像。如果您非常快速地滚动到列表,它也会取消运行请求。