У меня есть UICollectionView в моем приложении, и каждая ячейка представляет собой UIImageView и некоторые текстовые метки. Проблема в том, что когда у меня есть UIImageViews, отображающий их изображения, производительность прокрутки ужасная. Это не так гладко, как прокрутка опыта UITableView или даже того же UICollectionView без UIImageView.Плохая производительность прокрутки UICollectionView с UIImage
Я нашел this question несколько месяцев назад, и кажется, что ответ был найден, но он написан в RubyMotion, и я этого не понимаю. Я попытался понять, как преобразовать его в Xcode, но так как я никогда не использовал NSCache, это немного сложно. Плакат там также указал на here о внедрении чего-то в дополнение к их решению, но я не уверен, где поставить этот код. Возможно потому, что я не понимаю код из first question.
Может ли кто-нибудь помочь в переводе на 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
Вот код из second question, что спрашивающий из first question сказал, решил проблему:
UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path];
CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Опять же, я не знаю, как/где осуществить это.
Большое спасибо.
Оставьте свой код! Что вы пробовали? Почему производительность вашего приложения медленная? Каков результат профилирования, чтобы увидеть, что происходит? –
Это не мое приложение, которое имеет медленную производительность, оно только прокручивает ячейки в UICollectionView. Остальная часть приложения работает очень хорошо. В настоящее время я использую 'cell.cardImageView.image = [UIImage imageWithData: [NSData dataWithContentsOfFile: tempCard]];' для установки изображения. Используемое изображение не является частью пакета приложений, но обычно загружается и сохраняется в папке Caches. – Nick