Firebase дает иногда только части моих сохраненных значений, а иногда и все - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь написать свой собственный мессенджер. Я сохранил сообщения в базе данных Firebase. Я пытаюсь получить доступ к сообщениям обычным способом, как я делаю это каждый раз (database.database (). Reference (). Child ("users") ...., но он возвращает только несколько сообщений и толькоиногда каждое сообщение

Я уже пробовал его с .childAdded, но оно тоже не работает

func fetchMessages() {
        self.messages.removeAll()
        let uid = Auth.auth().currentUser!.uid
        let ref = Database.database().reference().child("users").child(uid).child("chats").child(self.chatuid).child("messages")
        ref.observeSingleEvent(of: .value) { (snap) in
            guard let data = snap.value as? [String: AnyObject] else { return }
            //MARK: data = (messageID, AnyObject)
            for (messageID, _) in data {
                ref.child(messageID).observeSingleEvent(of: .value) { (snap2) in
                    guard let data2 = snap2.value as? [String: AnyObject] else { return }
                    //MARK: data2 = ("message": String, "sentuid": String)
                    guard let message = data2["message"] as? String else { return }
                    guard let sentuid = data2["sentuid"] as? String else { return }
                    let messageToAppend = Message(sentuid: sentuid, message: message)
                    self.messages.append(messageToAppend)
                    self.messageTableView.reloadData()
                }
            }
        }
    }

//self.messages = Place where I save my fetched messages

Структура Firebase:

{


"users" : {
    "V3bLZu61KYTCG0uCWV8LH1f4rRJ3" : {
      "chats" : {
        "x3GzxwmyLbXrQNNyBF2a82KqrHa2" : {
          "messages" : {
            "20191014165454" : {
              "message" : "Heyho",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165647" : {
              "message" : "Blabla",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165754" : {
              "message" : "Blabla",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165800" : {
              "message" : "Fuchsloch",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165805" : {
              "message" : "Jlksaö",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165808" : {
              "message" : "Jadfsk",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165811" : {
              "message" : "Jskldflsö",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014170041" : {
              "message" : "JALSF",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "test" : {
              "messange" : "test",
              "sentUid" : "MatesForSports"
            }
          }
        }
      },
      "username" : "Acc2"
    },
    "x3GzxwmyLbXrQNNyBF2a82KqrHa2" : {
      "chats" : {
        "V3bLZu61KYTCG0uCWV8LH1f4rRJ3" : {
          "messages" : {
            "20191014165454" : {
              "message" : "Heyho",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165647" : {
              "message" : "Blabla",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165754" : {
              "message" : "Blabla",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165800" : {
              "message" : "Fuchsloch",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165805" : {
              "message" : "Jlksaö",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165808" : {
              "message" : "Jadfsk",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014165811" : {
              "message" : "Jskldflsö",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "20191014170041" : {
              "message" : "JALSF",
              "sentuid" : "V3bLZu61KYTCG0uCWV8LH1f4rRJ3"
            },
            "test" : {
              "messange" : "test",
              "sentUid" : "MatesForSports"
            }
          }
        }
      },
      "username" : "Acc1"
    }
  }
}

Я ожидал, что кодвернул бы около 10 сообщений, но иногда дает 5, иногда 3 или даже только 2 сообщения

Моя firebase-структура сообщений - это .child ("messages"), затем уникальный идентификатор, затем фактическийсообщение и отправитель в один слой

1 Ответ

0 голосов
/ 16 октября 2019

Вот ответ с последующим предложением.

Давайте начнем с репликации вашей структуры с использованием некоторых жестко закодированных значений

users
   uid_0
      chats
         chat_uid_0
           messages
              unique_id_0
                 msg: "My Message"
                 sent_uid: "uid_1"
              unique_id_1
                 msg: "Hello, World"
                 sent_uid: "uid_3"
              unique_id_2
                 msg: "another message"
                 sent_uid: "uid_2"

, затем кода для чтения в сообщениях, итерации по ними распечатайте msg и sent_uid

func readMessages() {
    let usersRef = self.ref.child("users")
    let messagesRef = usersRef.child("uid_0").child("chats").child("chat_uid_0").child("messages")
    messagesRef.observeSingleEvent(of: .value, with: { snapshot in
        let allMessages = snapshot.children.allObjects as! [DataSnapshot]
        for msg in allMessages {
            let msgText = msg.childSnapshot(forPath: "msg").value as? String ?? "No Msg"
            let sentUid = msg.childSnapshot(forPath: "sent_uid").value as? String ?? "No sender"
            print(msgText, sentUid)
        }
    })
}

, и вы получите:

My message uid_1
Hello, World uid_3
another message uid_2

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

Я не знаю ваш полный вариант использования, но это будетулучшенная структура

users
   uid_0
      name: "Hank"
   uid_1
      name: "Leroy"

chats
   uid_0
      chat_id_0: true
      chat_id_1: true
   uid_1
      chat_id_5: true

chat_id_0
   unique_id_0
      msg: "My Message"
      sent_uid: "uid_1"
   unique_id_1
      msg: "Hello, World"
      sent_uid: "uid_3"
   unique_id_2
      msg: "another message"
      sent_uid: "uid_2"

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

...