Вот что я пробовал до сих пор:

override func collectionView(_ collectionView: UITableView, willDisplay cell: UICollectionViewCell, forRowAt indexPath: IndexPath) {
    if (indexPath.row == self.dataArray.count-30) {
        pageNumber += 1
        self.downloadTask()
    }
}

Self.downloadTask () будет использовать pageNumber и загружать соответствующие данные.

Теперь, после того, как осталось 30 или более строк для отображения, номер страницы увеличивается многократно, и я хочу ограничить его только один раз, пока не завершится выполнение self.downloadTask (), а затем вернется и когда останутся еще 30 строк для отображения в UITableView.

Как я могу действовать таким образом, чтобы pageNumber увеличивался на 1 только один раз за 30 оставшихся строк для отображения в UITableView.

0
as diu 28 Май 2017 в 05:00

2 ответа

Лучший ответ

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

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

Например, если ваша функция downloadTask () извлекает 30 элементов одновременно, вы можете обработать ваш dataArray в 30 фрагментах элементов и получить следующий фрагмент (страницу), как только отобразится какой-либо элемент в последнем фрагменте:

let wantPage = indexPath.row / 30 + 1
if wantPage > pageNumber
{
   pageNumber = wantPage
   downloadTask()
}

Если downloadTask () получает менее 30 элементов за раз, и вы хотите, чтобы данные были на 30 элементов раньше позиции прокрутки представления коллекции, вы можете просто добавить это число к вычислению чанка (страницы):

let itemsPerPage = 10 
let wantPage     = (indexPath.row + 30) / itemsPerPage
if wantPage > pageNumber
{
   pageNumber = wantPage
   downloadTask()
}

Ваша переменная pageNumber в конечном итоге достигнет точки, в которой больше нет доступных данных (т. Е. Меньше, чем элементов на странице), и этот «абсолютный» расчет автоматически прекратит вызов метода downloadTask ().

0
Alain T. 28 Май 2017 в 13:34

Я изменил проверку количества массивов на 3 и смог ее реализовать. Обновленный код выглядит следующим образом:

override func collectionView(_ collectionView: UITableView, willDisplay cell: UICollectionViewCell, forRowAt indexPath: IndexPath) {
if (indexPath.row == self.dataArray.count-3) {
    pageNumber += 1
    self.downloadTask()
}

}

0
as diu 28 Май 2017 в 02:24