Память не освобождается во время выполнения пакетных обновлений в CollectionView - PullRequest
0 голосов
/ 26 марта 2019

Я работал над проектом использования двух UICollectionView, которые у меня есть, это MainViewController с полноэкранными ячейками, которые прокручиваются по горизонтали, и один, который располагается в этой полноэкранной ячейке и прокручивается по вертикали.У меня есть функциональность, которая добавляет, а также удаляет ячейки.Когда пользователь нажимает, и одна из страниц MainViewController удаляется с использованием кода под памятью, которая росла по мере добавления ячеек, все еще сохраняется.Я что-то не так делаю?Все мои делегаты являются слабыми ссылками, и ни одна из моих камер не имеет самозаверяющих закрытий.Я делаю что-то не так, спасибо за вашу помощь

Вот полный проект

https://github.com/TheRedCamaro30/Leaky-Nested-UICollectionViews

Установка или удаление делегата ячейки

func addCell(){
    self.mainCollectionView.performBatchUpdates({
        guard let last = arr.last else{
            return
        }
        arr.append(last + 1)
        let lastIndex = IndexPath(item: last, section: 0)
        self.mainCollectionView.insertItems(at: [lastIndex])
    }) { (completed) in
        print("Batch updates completed, performed successfully: \(completed)")
    }
    }

func removeCell() {
    self.mainCollectionView.performBatchUpdates({
    arr.popLast()
        self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])

    }) { (competed) in
        print("Perform batch updates completed")
    }
}

Полноразмерная популяция ячеек

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FullPageCell.reuseIdentifier, for: indexPath) as? FullPageCell else{
        assertionFailure("Fatal Error FullPageCell not dequed")
        return UICollectionViewCell()
    }
    cell.backgroundColor = UIColor.green
    cell.cellTappedDelegate = self

    return cell
}

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if let cell = cell as? FullPageCell{
            cell.setUpCollectionView()
    }
}

SubCollectionView сидит на полной странице ячейки населения

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SmallCell.reuseIdentifier, for: indexPath) as? SmallCell else{
        assertionFailure("Fatal Error FullPageCell not dequed")
        return UICollectionViewCell()
    }
    cell.backgroundColor = UIColor.yellow
    cell.imageView.image = self.image
    return cell
}

SetUpCollectionView

 func setUpCollectionView(){
   let view = self.contentView

   let layout = UICollectionViewFlowLayout()
   layout.minimumLineSpacing = 1
   layout.minimumInteritemSpacing = 1
   layout.scrollDirection = .vertical
   layout.itemSize = CGSize(width: (view.bounds.width - 2)/3, height: (view.bounds.width - 2)/3)

   collectionView = UICollectionView(frame:view.bounds, collectionViewLayout: layout)


   collectionView.dataSource = self
   collectionView.delegate = self
   collectionView.register(SmallCell.self, forCellWithReuseIdentifier: SmallCell.reuseIdentifier)
   collectionView.backgroundColor = UIColor.white

   self.collectionView.isPagingEnabled = true

   view.addSubview(collectionView)

   collectionView.translatesAutoresizingMaskIntoConstraints = false
   collectionView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
   collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0).isActive = true
   collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0).isActive = true
   collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
 }

1 Ответ

0 голосов
/ 26 марта 2019

Чтобы вставить, удалить или переместить отдельный раздел или элемент, необходимо выполнить следующие действия:

  1. Обновить данные в объекте источника данных.

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

Просто замените метод removeCell на приведенный ниже код.

func removeCell() {
    self.mainCollectionView.performBatchUpdates({
        arr.popLast()
        self.mainCollectionView.deleteItems(at: [IndexPath(item: arr.count - 1, section: 0)])
    }) { (competed) in
        print("Perform batch updates completed")
        //If it is not worked then reload collectionview
        //self.mainCollectionView.reloadData()
    }
}

Пожалуйста, обратитесь к ссылкам ниже.

Вставка, удаление и перемещение разделов и элементов

Руководство по программированию в виде коллекции для iOS

...