query - realtime database ios
Mostrar mensajes de los usuarios a los que sigue-swift (1)
He hecho una siguiente función donde los usuarios pueden seguir el uno al otro. El problema es que no se está utilizando como debería. En el momento en que un usuario escribe una publicación, se guardará en mi base de datos de Firebase con esta referencia:
FIRDatabase.database().reference().child("feed-items").childByAutoId()
Los feed-items son donde están todas las publicaciones. Sin embargo, ahora estoy cambiando eso, así que cuando un usuario está publicando algo, se guardará aquí:
FIRDatabase.database().reference().child("Users").child(UserID).child("Posts").childByAutoId()
Lo hago porque de alguna manera me dice que sería más fácil mostrar solo las publicaciones de las personas que sigues en mi feed de aplicaciones.
En este momento estoy recibiendo todas las publicaciones para mi feed (de feed-items) como esta:
func startObersvingDB() {
FIRDatabase.database().reference().child("feed-items").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
var newUpdates = [Sweet]()
for update in snapshot.children {
let updateObject = Sweet(snapshot: update as! FIRDataSnapshot)
newUpdates.append(updateObject)
}
self.updates = newUpdates.reverse()
self.tableView.reloadData()
}) { (error: NSError) in
print(error.description)
}
}
Y luego invoco startObservingDB () en viewDidLoad.
Si quieres ver mi Sweet
struct aquí está:
import Foundation
import FirebaseDatabase
import FirebaseAuth
import UIKit
struct Sweet {
let key: String!
let content: String!
let addedByUser: String!
let profilePhoto: String!
let itemRef: FIRDatabaseReference?
init (content: String, addedByUser: String, profilePhoto: String!, key: String = "") {
self.key = key
self.content = content
self.addedByUser = addedByUser
self.profilePhoto = profilePhoto
self.itemRef = nil
}
init (snapshot: FIRDataSnapshot) {
key = snapshot.key
itemRef = snapshot.ref
path = key
if let theFeedContent = snapshot.value!["content"] as? String {
content = theFeedContent
} else {
content = ""
}
if let feedUser = snapshot.value!["addedByUser"] as? String {
addedByUser = feedUser
} else {
addedByUser = ""
}
if let feedPhoto = snapshot.value!["profilePhoto"] as? String! {
profilePhoto = feedPhoto
} else {
profilePhoto = ""
}
}
func toAnyObject() -> AnyObject {
return ["content":content, "addedByUser":addedByUser, "profilePhoto":profilePhoto!]
}
}
Y en mi TableViewController estoy usando esto para mostrar el nombre, etc. en la celda personalizada:
var update = updates[indexPath.row]
cell.nameLabel.text = update.addedByUser
etcétera etcétera.
Mi pregunta es: ¿cómo puedo cambiar eso para mostrar solo las publicaciones de las personas que estoy siguiendo?
Perdón por la larga publicación
Suponiendo que está guardando su lista de seguidores como un diccionario en otro nodo padre como este: -
user_followed_by :{
userID2 : {
userID1 : true,
userID5 : true,
userID6 : true,
userID12 : true,
userID99 : true,
}
}
users :{
userID2 :{
post :{
postAutoID1 : {...},
postAutoID2 : {...},
...
}
}
}
postsToShowToUser :{
userID1 : {
postAutoID1 : true, //These are the post''s autoID''s of all the users whom
// your current user is following
postAutoID5 : true,
postAutoID3 : true,
},
}
/* // If you choose to declare a separate section of the post Details in your Database.
posts_Of_The_User :{
userID1 : {
postAutoID1 : {...//DETAILS},
postAutoID2 : {...//DETAILS},
postAutoID3 : {...//DETAILS},
....
},
} */
La idea es que cada vez que un usuario a quien su usuario actual sigue haga una publicación. El autoID de esa publicación se adjunta en el mensaje postsToShowToUser / userID .
Es decir, si userID2 hará una publicación, se realizará una llamada para agregar el ID automático de esa publicación en todos los usuarios postsToShowToUser / userID que estén siguiendo al ID de usuario2 .
PD: - Te sugiero encarecidamente que muevas los detalles de tu publicación fuera de post
sección de post
. Conviértalo en un nodo primario separado que consta de varios postAutoID como clave y allí publique los datos como valor. Puede ser útil más adelante, también evitará anidar datos, lo que lo ayudará a navegar a través de su Base de datos.