2015-08-17 4 views
3

У меня проблема. Прокрутка моего UICollectionView слишком отсталая из-за размера изображений, которые находятся в ячейках. Функция изменения размера изображения почти ничего не меняет. И у меня нет возможности сделать небольшие копии изображений из-за номера изображений. Итак, что мне делать, если мне нужно быстро загрузить изображения, как в собственном приложении Album? Я слышал о «ленивой загрузке», но я не могу найти в Swift учебник.Swift: UICollectionView images loading

Вот мой cellForItemAtIndexPath:

 let cell : MyCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCollectionViewCell 

     let painting = objs[indexPath.row] 
     let name = (painting.valueForKey("imageName") as? String)! 
     let path = NSBundle.mainBundle().bundlePath.stringByAppendingString("/\(name)") as NSString 

     cell.imageView.image = UIImage(contentsOfFile: path as String) 

     cell.layer.shouldRasterize = true 
     cell.layer.rasterizationScale = UIScreen.mainScreen().scale 

     return cell 

Я был бы рад, если бы вы помочь мне решить эту проблему! PS Приложение не загружает его с WEB. Все изображения находятся в приложении на устройстве.

UPDATE

Наконец, я осуществил SDWebImage. Это лучшее решение, которое я нашел. Вот мой cellForRowAtIndexPath:

let cell : MyCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! MyCollectionViewCell 
     let block: SDWebImageCompletionBlock! = {(image: UIImage!, error: NSError!, cacheType: SDImageCacheType, imageURL: NSURL!) -> Void in 
      //   println(self) 
     } 
     let path = NSBundle.mainBundle().bundlePath.stringByAppendingString("/\(images[indexPath.row])") as NSString 
     let url = NSURL.fileURLWithPath(path as String) 
     println(url) 

     cell.imageView.sd_setImageWithURL(url, placeholderImage: UIImage(named: "placeholder"), completed: block) 

     cell.layer.shouldRasterize = true 
     cell.layer.rasterizationScale = UIScreen.mainScreen().scale 

     return cell 

ответ

4

Это потому, что вы загружаете изображение в главном потоке, лучше сделать это на фоне потока, чтобы сделать его более гладким лучше декодировать изображение на фоновом потоке, а также. это вы будете установить изображение непосредственно будет декодировать, когда вы установите изображение в imageView, поэтому лучше первого расшифровывает его, а затем установить его в imageView.image

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {() -> Void in 
       var image = UIImage(contentsOfFile: path as String) 
UIGraphicsBeginImageContextWithOptions(image!.size, true, 0); 
     image?.drawAtPoint(CGPointZero) 
     image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
       dispatch_async(dispatch_get_main_queue(), {() -> Void in 
        cell.imageView.image = image 
       }) 
+0

Это почти решило мою проблему, свиток коллекции просматривается быстрее, но все еще немного лаги. Я думаю, причина в том, что слишком большие изображения. Любые идеи? –

+0

Для этого вам нужно также декодировать изображение на фоновом потоке –

+0

Проверить мой ответ здесь http://stackoverflow.com/a/31959595/718721 –

0

Почему бы вам не использовать:

let name = (painting.valueForKey("imageName") as? String)! 
cell.imageView.image = UIImage(named: name) 

вместо использования NSBundle как загружающее изображение с помощью метода имени кэширует изображение

+0

У меня слишком много изображений. Если я его кэширую, приложение получит слишком много памяти устройства. И первая загрузка этих изображений будет также медленной и медленной ... –