странное поведение tableView.reloadData () - PullRequest
0 голосов
/ 11 декабря 2018

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

My database

У меня есть пользовательская ячейка таблицы, в которой есть метка для отображения количества непрочитанных сообщений

 class UserCell: UITableViewCell {

var message: Message? {
    didSet {
        setNumberOfUnreadMessages()
}

fileprivate func setNumberOfUnreadMessages() {
    if let partnerId = message?.chatPartnerId(), let selfId = message?.selfId() {

        let unreadMessagesRef = Database.database().reference().child("unread-messages").child(selfId).child(partnerId).child("numberOfUnreadMessages")
        unreadMessagesRef.observe(.value, with: { (snapshot) in
            if let count = snapshot.value as? Int {
                self.unreadMessagesCountLabel.isHidden = false
                self.unreadMessagesCountLabel.text = String(count)
            } else {
                self.unreadMessagesCountLabel.isHidden = true
            }
            print(snapshot)
        }, withCancel: nil)
    }
}

Мой tableView

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as? UserCell
        let message = messages[indexPath.row]
        cell?.message = message
        return cell!
    }


func observeUserMessages() {
    guard let uid = Auth.auth().currentUser?.uid else { return }
    // getting reference to current user's node
    let ref = Database.database().reference().child("user-messages").child(uid)
    ref.observe(.childAdded, with: { (snapshot) in
        let userId = snapshot.key
        // getting reference to partners node in user's node
        let userMessagesRef = Database.database().reference().child("user-messages").child(uid).child(userId)
        userMessagesRef.observe(.childAdded, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String:AnyObject] {
                let message = Message(dictionary: dictionary)
                if let chatPartnerId = message.chatPartnerId() {
                    self.messagesDictionary[chatPartnerId] = message
                }
                self.attemptReloadOfTableView()
            }
        }, withCancel: nil)
    }, withCancel: nil)
    ref.observe(.childRemoved, with: { (snapshot) in
        print(snapshot.key)
        self.messagesDictionary.removeValue(forKey: snapshot.key)
        self.attemptReloadOfTableView()
    }, withCancel: nil)
}


// Big thank to Brian Woong)))))
var timer: Timer?

private func attemptReloadOfTableView() {
    self.timer?.invalidate()
    self.timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.handleReloadTableView), userInfo: nil, repeats: false)
}

@objc func handleReloadTableView() {
    self.messages = Array(self.messagesDictionary.values)
    self.messages.sort(by: { (message1, message2) -> Bool in
        return (message1.timeStamp?.intValue)! > (message2.timeStamp?.intValue)!
    })
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

Когда я запускаю свое приложение, каждый tableView.cell показывает правильное количество непрочитанных сообщений из базы данных.Когда я начинаю отправлять сообщения, tableView перезагружается и начинает показывать количество непрочитанных сообщений от отправителя не только в его ячейке, но и во ВСЕХ ячейках.Более того, в консоли я вижу, что с каждым новым сообщением он получает все больше и больше снимков из базы данных.

Что происходит?Как исправить эту странную ошибку?

1 Ответ

0 голосов
/ 12 декабря 2018
 let unreadMessagesRefHandle = unreadMessagesRef.observe(.value, with: { (snapshot) in
            if let count = snapshot.value as? Int {
                self.unreadMessagesCountLabel.isHidden = false
                self.unreadMessagesCountLabel.text = String(count)
            } else {
                self.unreadMessagesCountLabel.isHidden = true
            }
            print(snapshot)
        }, withCancel: nil)
        unreadMessagesRef.removeObserver(withHandle: unreadMessagesRefHandle)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...