загрузка чатов с firebase Swift - PullRequest
0 голосов
/ 03 мая 2018

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

func loadMsg() {
    let toId = user!.id!
    let fromId = Auth.auth().currentUser!.uid
    let ref = Database.database().reference().child("privateMessages").child(fromId).child(toId)
    ref.observe(.value) { (snapshot) in

        if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {

            self.messages.removeAll()

            for data in snapshot {

                let newMsg = Message(dictionary: data.value as! [String: AnyObject])

                self.messages.append(newMsg)

            }
        }
        DispatchQueue.main.async {self.tableView.reloadData()}
    }
}

что касается моей базы данных Firebase, она выглядит как enter image description here

и файл json

{
  "privateMessages" : {
    "0YfqnPIOYFYKb8cYZMHnSYti62i2" : {
      "StHPXFvTlVf5QDvWiuCi4JF8Hyr2" : {
    "-LB0AZRcWF0Ub5ZECzTf" : {
      "fromId" : "0YfqnPIOYFYKb8cYZMHnSYti62i2",
      "textMessages" : "Hi!first msg!",
      "timestamp" : 1524733200,
      "toId" : "StHPXFvTlVf5QDvWiuCi4JF8Hyr2"
    }
  },
  "kj7vcszbSvPBTVaC32Xg18aYZPi1" : {
    "-LB0EpR86dZSYl5p0k-E" : {
      "fromId" : "0YfqnPIOYFYKb8cYZMHnSYti62i2",
      "textMessages" : "Different guy,message 2",
      "timestamp" : 1524734318,
      "toId" : "kj7vcszbSvPBTVaC32Xg18aYZPi1"
    }
  }
},
"2wYq9dCKF4aZ26nOY41ApPOdGrJ2" : {
  "0YfqnPIOYFYKb8cYZMHnSYti62i2" : {
    "-LBV5jlvtxbZZJFQOwes" : {
      "fromId" : "2wYq9dCKF4aZ26nOY41ApPOdGrJ2",
      "textMessages" : "hi",
      "timestamp" : 1525252029,
      "toId" : "0YfqnPIOYFYKb8cYZMHnSYti62i2"
    }
  },
  "StHPXFvTlVf5QDvWiuCi4JF8Hyr2" : {
    "-LBVCQ5GaEugMNFMT2c-" : {
      "fromId" : "2wYq9dCKF4aZ26nOY41ApPOdGrJ2",
      "textMessages" : "hi",
      "timestamp" : 1525253780,
      "toId" : "StHPXFvTlVf5QDvWiuCi4JF8Hyr2"
    }
  }
},
"StHPXFvTlVf5QDvWiuCi4JF8Hyr2" : {
  "0YfqnPIOYFYKb8cYZMHnSYti62i2" : {
    "-LBVGEFG76z6tXtq43k5" : {
      "fromId" : "StHPXFvTlVf5QDvWiuCi4JF8Hyr2",
      "textMessages" : "Hi",
      "timestamp" : 1525254780,
      "toId" : "0YfqnPIOYFYKb8cYZMHnSYti62i2"
    }
  }
}
  },
  "users" : {
"0YfqnPIOYFYKb8cYZMHnSYti62i2" : {
  "email" : "test@yahoo.com",
  "id" : "0YfqnPIOYFYKb8cYZMHnSYti62i2",
  "name" : "tester",
  "profileImageUrl" : "https://firebasestorage.googleapis.com/v0/b/groupchatnappointment.appspot.com/o/profile_images%2FE509EFCB-E41D-4E6C-922B-01B146FD1FDC.png?alt=media&token=a7acb904-474b-4898-b99a-1e819ec96afc"
},
"StHPXFvTlVf5QDvWiuCi4JF8Hyr2" : {
  "email" : "test2@yahoo.com",
  "id" : "StHPXFvTlVf5QDvWiuCi4JF8Hyr2",
  "name" : "tester2",
  "profileImageUrl" : "https://firebasestorage.googleapis.com/v0/b/groupchatnappointment.appspot.com/o/profile_images%2F2A5009D7-51C4-4D95-88DF-DADB38C76E7B.png?alt=media&token=ae599135-8ff7-4c64-9667-b9a5cec3dcf8"
},
"kj7vcszbSvPBTVaC32Xg18aYZPi1" : {
  "email" : "tester3@yahoo.com",
  "id" : "kj7vcszbSvPBTVaC32Xg18aYZPi1",
  "name" : "tester3",
  "profileImageUrl" : "https://firebasestorage.googleapis.com/v0/b/groupchatnappointment.appspot.com/o/profile_images%2FD60F2433-14E2-4EE1-AA74-8171CBA1D3AD.png?alt=media&token=728f6171-e48d-4bae-9b84-007937ed3493"
    }
  }
}

и мой tableviewCells имеет функцию конфигурации

func configCell(message: Message) {

    self.message = message

    if message.fromId == currentUser {

        sentView.isHidden = false

        sentMsgLabel.text = message.textMessages

        receivedMsgLabel.text = ""

        receivedMsgLabel.isHidden = true

    } else {

        sentView.isHidden = true

        sentMsgLabel.text = ""

        receivedMsgLabel.text = message.textMessages

        receivedMsgLabel.isHidden = false
    }
}

как мне попытаться показать в своем журнале чата как то, что отправил мне мой получатель, так и то, что я им отправил?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Можете ли вы попробовать сохранить toId и fromId как строки?

let toId = String(user!.id!)

Это сработало для меня однажды.

0 голосов
/ 03 мая 2018

На самом деле ваш узел здесь неправильный .child(fromId).child(toId) таким образом, вы можете получать только односторонние сообщения.

let chatRoomId = (fromId < toId) ? fromId + "_" + toId : toId + "_" + formId 
/// It will look like "0YfqnPIOYFYKb8cYZMHnSYti62i2_kj7vcszbSvPBTVaC32Xg18aYZPi1"

А затем сохраните все сообщения здесь, и когда нужно получить, сделайте chatRoomId таким же образом. Таким образом, вы можете легко получить все чаты этих двух пользователей. Я также ответил за paging. Итак, взгляните на Firabase Paging и загрузите сообщения кусками. Это сделает лучший пользовательский опыт.

0 голосов
/ 03 мая 2018

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

Это выглядит очень похоже на вашу структуру данных, но теперь с одним узлом для "комнаты". Когда это возможно, я хотел бы основывать идентификатор комнаты на UID участников (подробнее об этом см. http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase). Так в вашем случае:

privateChats
  0YfqnPIOYFYKb8cYZMHnSYti62i2_StHPXFvTlVf5QDvWiuCi4JF8Hyr2
    -LB0AZ...CzTf
      ...
    -LB0F1...pvyJ
      ...

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

Для «списка разговоров» для пользователя я затем моделирую дополнительный узел для каждого пользователя:

chatsPerUser
  0YfqnPIOYFYKb8cYZMHnSYti62i2
          0YfqnPIOYFYKb8cYZMHnSYti62i2_StHPXFvTlVf5QDvWiuCi4JF8Hyr2: ...
  StHPXFvTlVf5QDvWiuCi4JF8Hyr2    
          0YfqnPIOYFYKb8cYZMHnSYti62i2_StHPXFvTlVf5QDvWiuCi4JF8Hyr2: ...

Здесь вы можете хранить любую информацию, необходимую для отображения списка разговоров, например, «имя комнаты» (обычно используется для комнат с> 2 участниками) или отметку времени последнего сообщения (полезно для отображения разговоров). в хронологическом порядке).

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