Carga perezosa en uicollectionview

aquí está el código de mi colección: está mostrando loggings, pero cargando, realmente, por favor, dime cómo puedo implementar la carga perezosa en esto. También tengo una foto de marcador de position en mi proyecto.

- (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; } 

En este momento está funcionando pero muy, muy lento.

Es bastante fácil hacer carga lenta usando 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; }); }); 

La forma más fácil de implementar eso es utilizar la biblioteca SDWebImage , hace lo que necesita. Hay UIImageView categoría UIImageView que te permitirá modificar el código para eso:

 - (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; } 
 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]; 

Tal vez, porque su image es tan grande, puede usar NSThread para cargar

 - (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; }