TableView мигает при перезагрузке данных - PullRequest
0 голосов
/ 09 декабря 2018

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

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

 func loadItems() {

    isFetchingMore = true

    //reloading section 1 with loading indicator
    tableView.reloadSections(IndexSet(integer: 1), with: .none)

    let url = URL(string: someURL)!
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in

        let newItems = (self.items.count...self.items.count+10).map {
            index in
            Item(display_name: "item \(index)", location: "subitem \(index)")
        }
        self.items.append(contentsOf: newItems)
        self.isFetchingMore = false
        self.tableView.reloadData()
      })
    }
    task.resume()
}

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

        let newItems = (self.items.count...self.items.count+10).map {
            index in
            Item(display_name: "item \(index)", location: "subitem \(index)")
        }

кодом, который получает данные из JSON

if let json = try! JSONSerialization.jsonObject(with: data!) as? [String : Any] {
                if let jsonItems = json["items"] as? [[String: Any]] {

                    for item in jsonItems {
                        if let display_name = item["display_name"] as? String,
                            let location = item["location"] as? String {
                            newItems.append(Item(display_name: display_name, location: location))
                        }
                    }
                }
            }

TableView начинает мигать при обновлениях.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

попробуйте обновить свойства ячеек, которые меняются, а не перезагружать весь tableView.

0 голосов
/ 09 декабря 2018

Попробуйте что-то вроде этого:

UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadRows(at: [IndexPath(row: 10, section: 0), IndexPath(row: 11, section: 0)], with: .none)
self.tableView.endUpdates()
UIView.setAnimationsEnabled(true)

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

...