Nella seguente guida di Firebase a structuring data per un'app di chat. Suggeriscono la struttura come visto di seguito.Strutturazione dei dati per l'app di chat in Firebase
{
// Chats contains only meta info about each conversation
// stored under the chats's unique ID
"chats": {
"one": {
"title": "Historical Tech Pioneers",
"lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
"timestamp": 1459361875666
},
"two": { ... },
"three": { ... }
},
// Conversation members are easily accessible
// and stored by chat conversation ID
"members": {
// we'll talk about indices like this below
"one": {
"ghopper": true,
"alovelace": true,
"eclarke": true
},
"two": { ... },
"three": { ... }
},
// Messages are separate from data we may want to iterate quickly
// but still easily paginated and queried, and organized by chat
// converation ID
"messages": {
"one": {
"m1": {
"name": "eclarke",
"message": "The relay seems to be malfunctioning.",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
},
"two": { ... },
"three": { ... }
}
}
Come faccio a strutturare i miei dati utente in modo che possa facilmente visualizzare un elenco di tutte le chat di cui fanno parte e per ognuno di essi visualizzare l'ultimo messaggio e timestamp. Se faccio la seguente struttura:
"users": {
"ghopper": {
"name": "Gary Hopper",
"chats": {
"one: true",
"two": true
}
},
"alovelace" { ... }
},
posso facilmente ottenere un elenco di ogni gruppo chat per un utente specifico, ad esempio ghopper, facendo (in rapido):
ref.child("users").child("ghopper").child("chats").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
//do something with data
}
Tuttavia ho vinto avere l'ultimo messaggio e il timestamp in questa istantanea. Cosa devo fare per accedere a questi dati?
- Duplicare tutti questi dati per ciascun utente? cioè aggiungendo utenti/ghopper/chat/uno/{"lastMessage": "ghopper: malfunzionamento del relay trovato Causa: falena", "timestamp": 1459361875666}
- Effettua una query per "chat/specificGroupId" per ogni chat che l'utente fa parte di (aggiungere più listener)?
- In qualche altro modo?
Qual è la funzione di lastMesssage = snapshot poiché non si utilizza tale variabile? Inoltre, è buona norma usare il nome self.variable all'interno di un blocco (chiusura). Inoltre, il file di ricerca all'interno del primo ref.child è un duplicato, quindi leggerà gli stessi dati. Il problema più grande è che Firebase è asincrono e che il ciclo for tight sta per essere eseguito * way * più velocemente di quanto i dati possano essere restituiti all'interno del blocco observ, quindi penso che si verifichino problemi di integrità dei dati - probabilmente Firebase dovrebbe farlo è 'roba' in modo asincrono. – Jay
Per rispondere alla domanda nella risposta. No, uid_2: false non è necessario come se non esistesse, potrebbe essere falso di default (dipende dal suo codice). E no, il database non cresce esponenzialmente. Se hai 10 utenti e 1 chat, tutti e 10 gli utenti sono in quella chat quindi l'unica cosa che cresce sarebbe il nodo degli utenti all'interno della chat (nella mia risposta) allo stesso modo se hai 1000 utenti e 100 chat, ogni chat con due utenti , sono ancora solo 100 chat ciascuna con un nodo utenti con due utenti. Anche con 1000 utenti e 1000 chat, questa non è una quantità notevole di dati. – Jay