2016-12-14 7 views
0

My UICollectionView извлекает изображения в cellForItemAt. После того, как я обновляюсь до быстрого 3, некоторые изображения не отображаются, когда я прокручиваю очень быстро. Вот мой код в cellForItemAt:UICollectionView изображение загрузки не может получить правильную ячейку swift 3

if (imageNotInCache) { 
    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
    if let thumb = imageFromPathAndCacheIt(path) { 
     DispatchQueue.main.async { 
      let updateCell = collectionView.cellForItem(at: indexPath) as! MyCustomCell? { 
      updateCell.imageView.image = thumb 
      } 
    } 
} 

Проблема заключается в том, иногда я получаю updateCell в ноль даже на экране (вероятно, из-за прокрутки для быстрой).

Я знаю, что мы можем добавить reloadData после добавления изображения, так же, как: Swift 3: Caching images in a collectionView, но я не хочу вызывать перезагрузку столько раз.

Благодарим вас за этот вопрос. Любые идеи были бы очень оценены!

ответ

1

Существует определенный компромисс между доступом и ручным обновлением содержимого ячеек и вызовом reloadData на весь вид коллекции, который вы могли бы попробовать.

Вы можете использовать func reloadItems(at: [IndexPath]), чтобы попросить UICollectionView перезагрузить одну ячейку, если она находится на экране.

Предположительно, imageNotInCache означает, что вы храните image в кэше в оперативной памяти, так что до тех пор, как image также доступен на func collectionView(UICollectionView, cellForItemAt: IndexPath), следующее должно «просто работать»:

if (imageNotInCache) { 
    DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { 
     if let thumb = imageFromPathAndCacheIt(path) { 
      DispatchQueue.main.async { 
       self.collectionView.reloadItems(at: [indexPath]) 
      } 
     } 
    } 
} 
+0

Спасибо за ваш ответ ! Это может сделать все изображения отображаемыми в правильных ячейках. Но вот теперь прокрутка в первый раз становится отрывистым ... Интересно, есть ли способ получить правильную ячейку для обновления? –

+0

Не беспокойтесь! Хм, не зная больше о том, как работает ваше приложение, я не уверен! Возможно, вам придется использовать инструменты, чтобы точно видеть, что блокирует основной поток во время прокрутки. На всякий случай, если вы этого не сделаете, просто создание 'UIImage' в фоновом потоке не будет декодировать изображение в память; это произойдет лениво, когда изображение появится на экране. Обычно это может вызвать большую задержку прокрутки. На SO есть много вопросов о том, как явно заставить «UIImage» декодировать раньше времени в фоновом режиме: http://stackoverflow.com/questions/3904575/decode-images-in-background-thread – TiM

+0

Существует также много оптимизаций, которые вы можете сделать в целом для повышения производительности прокрутки: https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.t8tw7ojhp – TiM

 Смежные вопросы

  • Нет связанных вопросов^_^