UITableview не отвечает при загрузке данных из firebase

My Tableview не реагирует ни на какие прикосновения, когда начинает загружать данные из firebase. (Он уже показывает ячейки, но не реагирует) Через некоторое время он выполняет прокрутку, которую вы пытались сделать, когда tableview не реагировал.

var filteredData = [archivCellStruct]()
func firData() {
filteredData.removeAll()
 var databaseRef : DatabaseReference!

    databaseRef = Database.database().reference()

databaseRef.child("Aufträge").child("Archiv").queryOrderedByKey().observe(.childAdded, with:{
        snapshot in
        let snap = snapshot.value as? NSDictionary

        //extracting the data and appending it to an Array
            self.filteredData.append(//myData)
            self.tableView.reloadData()

    })
}

Таким образом, он работает для меньших объемов данных (строк tableview), но с большой задержкой (и я уже фильтрую данные, чтобы ограничить данные, отображаемые в tableView). Я думаю, это как-то связано с tableView.reloadData () (возможно, взаимодействие пользователя отключено при перезагрузке?)

Можете ли вы предоставить окружающий код? Я подозреваю, что вы загружаете данные в основной поток, который вызывает блокировку.

binaryPilot84 08.09.2018 22:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
133
2

Ответы 2

каждый раз, когда вам нужно асинхронно перезагружать tableview -

var filteredData = [archivCellStruct]()
func firData() {
filteredData.removeAll()
 var databaseRef : DatabaseReference!

    databaseRef = Database.database().reference()

databaseRef.child("Aufträge").child("Archiv").queryOrderedByKey().observe(.childAdded, with:{
        snapshot in
        let snap = snapshot.value as? NSDictionary

        //extracting the data and appending it to an Array
            self.filteredData.append(//myData)

            DispatchQueue.main.async {      //change this in you code
            self.tableView.reloadData()
            }

    })
} 

Затем измените .childadded на .value, это может сработать, если это не работает в методе наблюдения

user10053625 08.09.2018 22:38

Итак, я остановил время сейчас. Он получает все данные за 1 секунду. При асинхронном выполнении для ответа табличного представления требуется 32 секунды. Без асинхронного выполнения это занимает 40 секунд.

Michael Baumgärtner 08.09.2018 22:47

С firebase вы можете пойти вручную:

Вариант использования:

struct UseCaseName {
     struct Request {}
     struct Response {
         let firebaseCallbackData: [FirebaseModelType]
     }
     struct ViewModel {
         let data: [DisplayType]
     }
}

ViewController:

var filteredData: [DisplayType]! = []
override func viewWillAppear() {
    // this one can make you trouble, adjust the observation logic to whatever you need. `WillAppear` can fire multiple times during the view lifecycle
    super.viewWillAppear()
    interractor?.observe()
}

func showData(viewModel: Scene.Usecase.ViewModel) {
    // this is where the different approach begins
    tableView.beginUpdates()
    var indexPaths = [NSIndexPath]()
    for row in (filteredData.count..<(FilteredData.count + viewModel.data.count)) {
        indexPaths.append(NSIndexPath(forRow: row, inSection: 0))
    }

    filteredData += viewModel.data

    tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
    tableView.endUpdates()
}

Интеррактор:

func observe(request: Scene.UseCase.Request) { /* signup for updates with observe(_ eventType: DataEventType, with block: @escaping (DataSnapshot) -> Void) -> UInt */
     callback is something like { DataSnapshot in presenter.presentData(response: Scene.Usecase.Response())
}

Ведущий:

func presentData(response: Scene.UseCase.Response) {
    /* format for representation */
    DispatchQueue.main.async {
        controller.present(viewModel: Scene.UseCase.ViewModel())
    }
}

Простите за отрыв потока, я пристрастился к этому пути. Также я предполагаю, что данные в базе данных не изменяются, а добавляются (из-за части observe(.childAdded,. Если я ошибаюсь, отредактируйте свой вопрос, чтобы отразить это. Другое предположение состоит в том, что у вас есть единственный раздел. Дон » Не забудьте изменить inSection: 0 на нужный раздел. Я ленив, и ТАК не так удобен для мобильных устройств. Таким образом добавляются только новые значения, отправленные Firebase, и работает быстрее.

Обновлено: по другому ответу.

DispatchQueue.main.async { //change this in you code self.tableView.reloadData() }

Иногда не стоит перезагружать все предметы. Однако это зависит от количества. Если мои предположения верны, будет лучше обновлять отдельные ячейки без перезагрузки всей таблицы при изменении. Быстрый пример: что-то вроде чата с серверной частью Firebase. объяснение: добавление одной строки в любом случае будет работать быстрее, чем reloadData (), но разница большая только тогда, когда вы часто вызываете эти методы. В примере чата разница может быть достаточно большой, если чат является спамом, чтобы оптимизировать поведение перезагрузки UITableView в вашем контроллере.

Также будет приятно увидеть код, который влияет на методы. Возможно, это проблема с потоками, как сказал Джон Айерс в комментариях. Куда вы позвоните func firData()?

Другие вопросы по теме