PrefetchItems UICollectionView не вызывается - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь реализовать предварительную выборку данных для моего UICollectionView с использованием протокола UICollectionViewDataSourcePrefetching;однако соответствующий метод не вызывается.
Представление коллекции имеет пользовательский макет .Я также пробовал с обычной схемой потока, те же результаты.
После перезагрузки данных я выполняю следующий код, чтобы у представления собрания был размер его содержимого, чтобы предотвратить прокрутку в этом представлении собрания, но в представлении прокрутки внепредставление коллекции:

func reloadData() {
    viewDidLayoutSubviews()
    collectionView.reloadData()
    collectionView.layoutIfNeeded()
    viewDidLayoutSubviews()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    collectionViewHeightConstraint.constant = collectionView.collectionViewLayout.collectionViewContentSize.height
    collectionView.layoutIfNeeded()
    view.layoutIfNeeded()
}

Может быть, это как-то связано с этим?

Что я сделал:

  • мой UIViewController делает наследовать от UICollectionViewDataSourcePrefetching
  • collectionView.prefetchDataSource = self (также пытались использовать раскадровку)
  • collectionView.isPrefetchingEnabled = true (также пытались использовать раскадровку)
  • Я реализовал collectionView(_:prefetchItemsAt:)

Проблема:

Метод prefetchItemsAt не вызывается.Я определил это, поместив оператор print в метод и установив точку останова.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

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

Я создал трекер prefetchState, который определяет, выполняю ли я предварительную выборку в данный момент или нет:

enum PrefetchState {
    case fetching
    case idle
}
var prefetchState: PrefetchState = .idle

Затем я подключил делегат представления прокрутки (представление прокрутки, в котором находится мое представление коллекции) к контроллеру представления и реализовал метод scrollViewDidScroll:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard scrollView == self.scrollView else { return }

    let prefetchThreshold: CGFloat = 100 // prefetching will start 100pts above the bottom of the scroll view
    if scrollView.contentOffset.y > scrollView.contentSize.height-screenBounds.height-prefetchThreshold {
        if prefetchState == .idle {
            prefetchItems()
        }
    }
}

Там выЯ вижу, что я проверяю, нет ли уже предварительной загрузки.Если нет, я звоню prefetchItems(), как здесь реализовано:

func prefetchItems() {
    guard prefetchState == .idle else { return }
    prefetchState = .fetching
    someDownloadFuncWithCompletionBlock { (newItems) in
        self.dataSource += newItems
        self.collectionView.reloadData()
        self.prefetchState = .idle
    }
}
0 голосов
/ 15 мая 2018

Я выполняю следующий код, чтобы заставить представление коллекции иметь размер своего содержимого, чтобы предотвратить прокрутку в этом представлении коллекции, но в представлении прокрутки вне представления коллекции:

Это звучиточень сломан.

Почему вы это делаете?

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

Представление коллекции вызывает этот метод, когда пользователь прокручивает

Если вы заставляете фрейм представления коллекции совпадать с размером контента, то вы полностью нарушаете UICollectionView.

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

Если вы хотите прокрутить представление коллекции ... позвольте представлению коллекции обработать его.Вам не нужно помещать представление коллекции в другое представление прокрутки.

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