Można skorzystać z SDWebImage
https://github.com/rs/SDWebImage dla leniwego ładowania. Możesz użyć tego skutecznie z UICollectionView
.
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
/*---------
----Other CollectiveView stuffs------
-----------------*/
if([[NSFileManager defaultManager] fileExistsAtPath:YOUR_FILE_PATH isDirectory:NO])
{
imagView.image=[UIImage imageWithContentsOfFile:YOUR_FILE_PATH];
}
else
{
UIActivityIndicatorView *act=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[imagView addSubview:act];
act.center=CGPointMake(imagView.frame.size.width/2, imagView.frame.size.height/2);
[act startAnimating];
__weak typeof(UIImageView) *weakImgView = imagView;
[imagView setImageWithURL:[NSURL URLWithString:REMOTE_FILE_PATH] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){
for(UIView *dd in weakImgView.subviews)
{
if([dd isKindOfClass:[UIActivityIndicatorView class]])
{
UIActivityIndicatorView *act=(UIActivityIndicatorView *)dd;
[act stopAnimating];
[act removeFromSuperview];
}
}
NSString *extension=[YOUR_FILE_PATH pathExtension];
[self saveImage:image withFileName:YOUR_FILE_PATH ofType:extension];
}];
}
}
Tak z ciekawości: dlaczego dequeueReusableCellWithReuseIdentifier: forIndexPath: nie wystarcza? Czy to nie jest już leniwe ładowanie? Myślałem, że komórka zostanie wyświetlona zaraz po tej metodzie. – Masa
@Masa to "rodzaj" leniwego ładowania, ale wyobraź sobie, że masz pełny ekran o rozdzielczości 2208x1242 pikseli i chcesz zezwolić tylko na jedno połączenie http do widocznego obrazu. 'cellForItemAtIndexPath' byłby uruchamiany wielokrotnie, w zasadzie jest to wstępne pobieranie, a nie leniwe ładowanie. FYI: ten uczestnik jest dostępny w ios8 https://developer.apple.com/library/IOs/documentation/UIKit/Reference/UICollectionViewDelegate_protocol/index.html#//apple_ref/occ/intfm/UICollectionViewDelegate/collectionView:willDisplayCell:forItemAtIndexPath: –