Данные перезагрузки UITableView мигают на секунду

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

Вот код, который я использую для перезагрузки данных в tableView

func handleWSSuccessResponse(_ arrRestaurant:[Restaurant],filterBy:filteringByValues){
    let offSet = self.IBtblUserFeed.contentOffset
    print(arrRestaurant.count)
    if (self.arrRestaurants.count > 0) {
        if arrRestaurant.count > 0 && arrRestaurant.count <= 10 {
            if arrRestaurant.count % 10 != 0 {
                isDataLoading = false

                actInd.stopAnimating()
            }
            if !(self.isFromRefresh) {
                self.arrRestaurants = self.arrRestaurants + arrRestaurant
            }
            DispatchQueue.main.async {
                if (self.isFromRefresh) {
                    self.IBtblUserFeed.reloadData()
                } else {
                    UIView.setAnimationsEnabled(false)
                    self.IBtblUserFeed.reloadData()
                    UIView.setAnimationsEnabled(true)
                    self.IBtblUserFeed.layoutIfNeeded()
                    self.IBtblUserFeed.setContentOffset(offSet, animated: false)
                }
            }
        } else {
            isDataLoading = false

            DispatchQueue.main.async {
                if (self.isFromRefresh) {
                    self.IBtblUserFeed.reloadData()
                } else {
                    UIView.setAnimationsEnabled(false)
                    self.IBtblUserFeed.reloadData()
                    self.IBtblUserFeed.layoutIfNeeded()
                    self.IBtblUserFeed.setContentOffset(offSet, animated: false)
                    UIView.setAnimationsEnabled(true)
                }
            }
        }
    } else {
        self.arrRestaurants = arrRestaurant

        if arrRestaurant.count % 10 != 0 {
            isDataLoading = false
            actInd.stopAnimating()
        }

        if self.arrRestaurants.count == 0 {
            self.IBtblUserFeed.tableHeaderView = nil
            self.IBtblUserFeed.tableHeaderView?.isHidden = true
        } else {
            if filterBy.isFiltering{
            } else {
                self.IBtblUserFeed.tableHeaderView = self.header()
            }

            self.IBtblUserFeed.tableHeaderView?.isHidden = false
        }

        if filterBy.isFiltering{
            self.reloadTableView()
            // tejas changes
            // filterRestaurant(filterBy: filterBy)
        }else{
            self.reloadTableView()
        }
    }
}

person Atpl Mohali    schedule 18.01.2018    source источник
comment
Я думаю, это связано с изменением смещения содержимого табличного представления.   -  person Xchord    schedule 18.01.2018
comment
Если я не изменю contentOffset, то перезагрузка данных начнется сверху, чего я не хочу.   -  person Atpl Mohali    schedule 18.01.2018
comment
Я хочу, чтобы это было так же, как в инстаграме, по мере загрузки следующих данных не должно быть щелчка   -  person Atpl Mohali    schedule 18.01.2018


Ответы (1)


Ваш примерный код слишком загроможден несвязанными вещами, чтобы дать четкий ответ; однако я думаю, что проблема связана с использованием reloadData; вместо этого вы должны использовать insertRows(at:with:) для плавного добавления строк.

Поэтому всякий раз, когда вы добавляете объекты модели ресторана в свой массив (из кода видно, что вы никогда не применяете другие изменения, такие как модификации или удаления), генерируйте индексные пути новых строк...

let indexPaths = (countBeforeAdding..<countAfterAdding).map { IndexPath.init(row: $0, section: 0) }

... и вставьте их в табличное представление:

tableView.beginUpdates()
tableView.insertRows(at: indexPaths, with: .automatic)
tableView.endUpdates()
person dr_barto    schedule 20.01.2018
comment
Даже после того, как я попробовал этот метод, моя таблица прокручивается вверх, и я не хочу, чтобы она оставалась в точке, где я вызывал API для получения следующих значений. - person Atpl Mohali; 22.01.2018
comment
Вот почему я использовал tableview.setcontentoffset - person Atpl Mohali; 22.01.2018
comment
Но так как после перезагрузки таблицы или использования вашего метода она прокручивается вверх, и я заставляю ее прокручиваться по последнему смещению без анимации. Это вызывает мерцание. - person Atpl Mohali; 22.01.2018
comment
@AtplMohali, ты все еще где-то используешь reloadTable? - person dr_barto; 22.01.2018
comment
Нет, это единственное место, где я перезагружаю данные. - person Atpl Mohali; 23.01.2018
comment
Он не мерцает во всех точках загрузки, но мерцает в некоторых точках. - person Atpl Mohali; 23.01.2018
comment
Должен ли я использовать collectionView вместо tableView - person Atpl Mohali; 23.01.2018
comment
Вы должны диагностировать проблему, создав минимальную версию представления с нуля — просто табличное представление с фиктивными данными, которое добавляет пакеты строк при нажатии кнопки панели навигации (вы даже можете сделать это на игровой площадке)... без всех setContentOffset, layoutIfNeededи т. д. -- они не должны быть необходимы для такой простой таблицы. И: табличное представление должно быть способно делать то, что вы хотите — представление коллекции не упростит задачу, особенно если вы уже боретесь с табличным представлением. - person dr_barto; 23.01.2018
comment
Спасибо, я попробую это - person Atpl Mohali; 23.01.2018