prefetchRowsНе вызывается для последних строк - PullRequest
1 голос
/ 24 января 2020

Я столкнулся с одной проблемой в реализации UITableViewDataSourcePrefetching .

У меня всего 62 записи в облаке, и я вызываю API, который возвращает 15 записей на страницу.

Я также реализовал метод prefetchRowsAt , который частично мне подходит.

Проблема в том, что описанный выше метод не возвращает все indexPath, который он собирается загрузить, поэтому, как вы можете видеть из журналов снизу, он достигает только 53, и в моем табличном представлении он показывает только 60 записей.

Indexpaths to fetch : [[3, 51], [3, 42], [3, 52], [3, 41], [3, 53], [3, 40], [3, 54], [3, 39], [3, 55], [3, 38], [3, 56], [3, 37], [3, 57], [3, 36], [3, 58], [3, 35], [3, 59], [3, 34], [3, 60], [3, 33]]
Indexpaths to fetch : [[3, 51], [3, 50], [3, 49], [3, 48], [3, 47], [3, 46], [3, 45], [3, 44], [3, 43]]
Indexpaths to fetch : [[3, 52]]
Indexpaths to fetch : [[3, 53]]

Вот мой метод реализации

extension MyViewController:UITableViewDataSourcePrefetching{
    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath]) {
        #if DEBUG
            print("Indexpaths to fetch : \(indexPaths)")
        #endif

        if indexPaths.contains(where: isLoadingCell) {
            self.loadFurthersSessionNotification?()
        }
    }
}

private extension MyViewController {
  func isLoadingCell(for indexPath: IndexPath) -> Bool {
    if indexPath.section != 3{
        return false
    }
    return (indexPath.row - 1) >= self.aryCloudObjects.count
  }
}

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 24 января 2020

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

Из документации :

Табличные представления не вызывают этот метод для ячеек они требуются немедленно, поэтому ваш объект источника данных также должен иметь возможность извлекать сами данные.

Предварительная выборка позволяет подготовиться к отображению строк, но если данные не были предварительно выбраны, когда cellForRowAt: вызывается, тогда вам нужно извлечь данные.

...