Коллекция Просмотр многоразовых ячеек при прокрутке - PullRequest
0 голосов
/ 10 февраля 2020

Я использую представление коллекции, чтобы показать GIF-файлы в списке. Теперь сталкиваемся с проблемой повторного использования ячеек при прокрутке ячеек вверх или вниз в режиме сбора.

Как и itemA находится на первом месте в списке и itemB находится на втором месте в списке. но когда я прокручиваю данные в представлении коллекции. места предметов оказались неуместными. Как-то раз пункт А ушел на 5-е место или иногда где-нибудь в списке. я знаю, я думаю, что это использование с многоразовой клеткой, но не знаю, как решить эту проблему. Plss help.

Представление коллекции cellForItemAt

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "GifCell", for: indexPath as IndexPath) as? GifCell else {
        fatalError()
    }

    if gifArr.count > 0 {

        let urlString = self.gifArr[indexPath.row]
        let url = URL(string: urlString)!

        DispatchQueue.global().async {
            let imageData = try? Data(contentsOf: url)
            let imageData3 = FLAnimatedImage(animatedGIFData: imageData) // this is the 3rd pary library to show the gifs on UIimageview's
            DispatchQueue.main.async {
                cell.imageView.animatedImage = imageData3
                cell.textLabel.text = String(indexPath.row)
            }
        }
    }
    return cell
}

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Первое решение : Вы можете кэшировать данные и каждый раз проверять, есть ли, использовать ваш кеш. Вы можете использовать эту ссылку , но заменить UIImage типом подарка!

или попробовать, я не проверял

if let giftAny = UserDefaults.standard.value(forKey: "giftUrl") {
  //cast giftAny to Data
  // use cached gift
} else {
  // cache gift
  let giftData = try? Data(contentsOf: url)
  UserDefaults.standard.setValue(giftData, forKeyPath: "giftUrl")
  //use gift
}

Второе решение : не используйте ячейку повторно

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = UICollectionViewCell(style: .default, reuseIdentifier:"Cell")
        return cell
    }

, но в этом случае, если у вас много ячеек, утечка памяти неизбежна.

0 голосов
/ 10 февраля 2020

В GifCell можно реализовать метод prepareForReuse():

Выполняет любую очистку, необходимую для повторной подготовки представления к использованию.

override func prepareForReuse() {
    super.prepareForReuse()
    imageView.animatedImage = nil
    textLabel.text = ""
}

Примечание : в этот момент каждый раз, когда вызывается метод cellForItemAt, URL-адрес будет перезагружаться, поэтому позже вам может потребоваться найти способ кэширования изображений вместо их дальнейшей загрузки.

...