Как изначально загрузить UITableView, а затем наблюдать за узлом Firebase на предмет изменений, чтобы обновить представление таблицы в Swift? - PullRequest
0 голосов
/ 14 мая 2019

Я загружаю UITableView с User данными, извлекаемыми из Firebase, первоначально используя observeSingleEvent, который, как я понимаю, не присоединяет наблюдателя после первоначального чтения.

У меня также есть значок в каждой ячейке, который обновляется, когда пользователь онлайн / оффлайн. Для этого я присоединяю наблюдателя к observe любым изменениям определенного дочернего узла User в моем методе делегата ячейки willDisplay и удаляю наблюдателя в методе didEndDisplaying.

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

cellForRowAt метод, который удаляет и настраивает ячейку:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

       guard let cell = tableView.dequeueReusableCell(withIdentifier: "ConversationsListCell", for: indexPath) as? ConversationsListCell else { return UITableViewCell() }

        let message = messages[indexPath.row]


        DataService.run.getUserInfo(forUserId: message.chatPartnerId()!) { (user) in
            cell.configureCell(message: message, user: user)
        }
        return cell

    }//end func

willDisplay метод присоединяет наблюдателя к определенному дочернему узлу и запускает tableView.reload (), если есть какие-либо изменения в узле:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        let message = messages[indexPath.row]

        DataService.run.observeUserNodeChages(forId: message.chatPartnerId()!) { (user) in
            self.tableView.reloadData()
        }

    }//end func

didEndDisplaying метод удаляет наблюдателя, прикрепленного методом willDisplay:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {

        if indexPath.row < messages.count {

            let message = messages[indexPath.row]
            DataService.run.removeObserveUserNodeChages(forId: message.chatPartnerId()!)
        }

    }//end func

observeUserNodeChages, который прослушивает любые изменения в определенном uid дочернем узле

func observeUserNodeChages (forId: String, handler: @escaping (Bool) -> ()){

        print("inside observeUserNodeChages forId:\(forId)")

        conversationListHandle = REF_USERS.child(forId).observe(.childChanged, with: { (snapshot) in

           handler(true)

        }, withCancel: nil)

    }//end func

user узел структуры Firebase

enter image description here

1 Ответ

0 голосов
/ 15 мая 2019

Я хочу знать, является ли это стандартным для отрасли способом

Это не является отраслевым стандартом, и его следует избегать, так как это вызовет мерцание и медленный отклик вашего пользовательского интерфейса. Однако когда дело доходит до кодирования, обычно не существует «стандарта», поскольку код, который вы пишете для решения проблемы, будет различаться в зависимости от варианта использования и необходимого результата.

Ваш источник данных tableView должен быть изначально заполнен из Firebase, а затем обновлен, когда есть изменение; это будет инициировано событием Firebase. После обновления источника данных обновите tableView.

Это будет держать приложение отзывчивым и ваши пользователи счастливы.

Другое дело, что вы подключаете несколько наблюдателей к одному и тому же узлу (пользователям). Это не может быть необходимым; прикрепите своих наблюдателей к узлу / users, и вы будете уведомлены о добавленных, измененных или удаленных событиях, и какой бы пользователь ни был затронут, будет передан закрытию firebase в качестве снимка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...