Как правильно управлять памятью при использовании дочерних контроллеров представления в ячейках UICollectionView? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть UIViewController (HomeController) с горизонтальной прокруткой UICollectionView .Это представление коллекции содержит 2 ячейки (число не является динамическим, всегда будет только 2 ячейки).Ячейка покрывает весь экран.В каждой ячейке у меня есть дочерний контроллер представления, который имеет сам UICollectionView и прокручивает вертикально.Ячейки этого внутреннего collectonView содержат большие изображения (охватывают весь размер ячейки).Я настроил свои дочерние контроллеры представления в viewDidLoad HomeController следующим образом:

addChild(viewController)
viewController.didMove(toParent: self)

Чтобы добавить представление дочернего контроллера как подпредставление для моих ячеек, у меня есть свойство hostedView вкласс ячейки:

class ContainerCell: UICollectionViewCell {

var hostedView: UIView? {
    didSet {
        guard let hostedView = hostedView else {
            return
        }
        contentView.addSubview(hostedView)
        hostedView.translatesAutoresizingMaskIntoConstraints = false
        hostedView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true
        hostedView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true
        hostedView.leftAnchor.constraint(equalTo: contentView.leftAnchor).isActive = true
        hostedView.rightAnchor.constraint(equalTo: contentView.rightAnchor).isActive = true
    }
}

}

Это hostedView ячейки, которую я настроил в cellForItemAt метод:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = containerView.dequeueReusableCell(withReuseIdentifier: ContainerCell.reuseIdentifier, for: indexPath) as! ContainerCell
        cell.hostedView = childControllers[indexPath.item].view
        return cell
    }

childControllers - это массив, в котором я храню два моих дочерних контроллера представления.

Проблема возникает, когда приложение запускается в первый раз, и я прокручиваю из первой ячейки во вторуюзадержка реакции пользовательского интерфейса на прокрутку.Он прокручивается не сразу, а примерно через 0,5 секунды после того, как я сделал жест прокрутки.После этого прокрутка вперед и назад работает нормально.Насколько я могу судить, это происходит потому, что при запуске 2-я ячейка не видна, а метод cellForItemAt для нее еще не запущен.Он запускается, когда я прокручиваю до этой ячейки.Это совершенно нормальное поведение благодаря механизму повторного использования iOS.Но похоже, потому что в ячейке есть дочерний контроллер с большими изображениями, слишком много памяти нужно выделить, поэтому это вызывает эту задержку.При запуске Xcode показывает около 100 Мб памяти, после прокрутки ко второй ячейке он увеличивается почти до 200 Мб.Так что даже если я инициализирую все дочерние контроллеры на viewDidLoad , память для них выделяется только на этапе cellForItemAt .Я хотел бы выделить эту память на начальном этапе, чтобы при прокрутке они уже были в памяти.Это как бы противоречит механизму повторного использования ячеек, но я знаю, что всегда будет только две ячейки (и два дочерних контроллера), поэтому мне не нужно такое динамическое поведение стиля из моего collectionView.

Я пыталсяиспользовать разные reuseIdentifiers для ячеек и назначить представление дочернего контроллера для hostedView ячейки в viewDidLoad , а не в cellForItemAt , но это не сработало.

Есть ли способ сделать это?А если нет, как подойти к этому по-другому?Эта задержка в реакции пользовательского интерфейса действительно разрушает пользовательский опыт приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...