Pauvres UICollectionView Les Performances De Défilement Avec UIImage

J'ai un UICollectionView dans mon application, et chaque cellule est une UIImageView et certaines étiquettes de texte. Le problème est que lorsque j'ai le UIImageViews l'affichage de leurs images, les performances de défilement est terrible. C'est loin d'être aussi lisse que le défilement de l'expérience d'un UITableView ou même le même UICollectionView sans UIImageView.

J'ai trouvé cette question à partir d'un il ya quelques mois, et il semble que la réponse a été trouvée, mais il est écrit en RubyMotion, et je ne comprends pas. J'ai essayé de voir comment le convertir à Xcode, mais depuis je n'ai jamais utilisé NSCache soit, c'est un peu dur pour. L'affiche il y a également souligné ici sur la mise en œuvre de quelque chose en plus de leur solution, mais je ne sais pas où mettre ce code soit. Peut-être parce que je ne comprends pas le code de la première question.

Quelqu'un pour être en mesure d'aider à traduire ceci dans Xcode?

def viewDidLoad
  ...
  @images_cache = NSCache.alloc.init
  @image_loading_queue = NSOperationQueue.alloc.init
  @image_loading_queue.maxConcurrentOperationCount = 3
  ...
end

def collectionView(collection_view, cellForItemAtIndexPath: index_path)
  cell = collection_view.dequeueReusableCellWithReuseIdentifier(CELL_IDENTIFIER, forIndexPath: index_path)
  image_path = @image_paths[index_path.row]

  if cached_image = @images_cache.objectForKey(image_path)
    cell.image = cached_image
  else
    @operation = NSBlockOperation.blockOperationWithBlock lambda {
      @image = UIImage.imageWithContentsOfFile(image_path)
      Dispatch::Queue.main.async do
        return unless collectionView.indexPathsForVisibleItems.containsObject(index_path)
        @images_cache.setObject(@image, forKey: image_path)
        cell = collectionView.cellForItemAtIndexPath(index_path)
        cell.image = @image
      end
    }
    @image_loading_queue.addOperation(@operation)
  end
end

Voici le code à partir de la deuxième question que le demandeur de la première question dit résolu le problème:

UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path];

CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Encore une fois, je ne suis pas sûr de savoir comment/où à la mettre en œuvre.

Merci beaucoup.

  • Poster votre code! Qu'avez-vous essayé? Pourquoi les performances de votre application lent? Quel est le résultat de profilage pour voir ce qu'il se passe?
  • Ce n'est pas la totalité de mon application qui est d'avoir de lenteur, c'est seulement le défilement à travers les cellules de la UICollectionView. Le reste de l'appli fonctionne très bien. Je suis actuellement à l'aide cell.cardImageView.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:tempCard]]; de régler l'image. L'image utilisée(s) ne fait pas partie de l'app bundle, mais généralement téléchargés et stockés dans les Caches dossier.
InformationsquelleAutor Nick | 2013-04-03