0

Ich verwende Firestore als mein iOS-Apps-Backend.Schnelle Firestore-Abfrage über Objektschlüssel

Ich habe eine Struktur wie so ...

/users 
    /userId 
      name:"Bob" 
      /likedPosts //this is the object, not a collection 
       "post1":true 
       "post2":true 

Als Ergebnis - Ich versuche, die ‚likedPosts‘ (Post-Klasse) Profil des Benutzers angezeigt werden soll.

Ich kann nicht herausfinden, wie Sie die Ergebnisse abfragen, um die Benutzer likedPosts zu erhalten und dann abfragen, um jeden Beitrag anzuzeigen.

func getUserNameAndInfo() { 
    if let user = Auth.auth().currentUser { 
     // User is signed in 

     // References to firebase 
     let userFS = Firestore.firestore().collection("users") 

     // Set the navigation title to users name 
     userFS.document(user.uid).getDocument { (document, error) in 
      if let userInfo = document { 
       let firstName = userInfo["firstName"] as! String 
       let lastName = userInfo["lastName"] as! String 
       let likedPostsDictionary = userInfo.data()["likedPosts"] as! NSDictionary 
       for (postId, _) in likedPostsDictionary { 
        self.userLikedPostsArray.append(postId as! String) 
        print(self.userLikedPostsArray) 
       } 

      } else { 
       print("User name does not exist") 
      } 
     } 
} 

So kann ich alle IDs für die Beiträge bekommen. Aber ich bin verwirrt darüber, wie ich Firestore abfragen könnte, um die Informationen für diese IDs zu erhalten.

Antwort

1

Sie können die Benutzer-Likes in einem Post behalten und abfragen, wo die ID des aktuellen Benutzers true ist.

Wenn Sie Ihre aktuelle Struktur verwenden, müssen Sie die Daten für jeden Beitrag einzeln abrufen. Sobald Sie Ihr Array von Post-Schlüsseln haben, können Sie zumindest einige Arten von Listenansichten mit leeren Zellen füllen. Dann müssen Sie für jede dieser Zellen die Daten abrufen - Sie können diese Verantwortung an die Zelle selbst weitergeben, damit sie sich selbst rendert, sobald die Daten für diesen Post abgerufen wurden.

Sie können einen Beitrag Dokument mit einer Post-Taste abgerufen werden, wie folgt:

let postDocRef = db.collection("posts").document(postId); 

postDocRef.getDocument { (document, error) in 
    if let document = document { 
     print("Document data: \(document.data())") 
    } else { 
     print("Document does not exist") 
    } 
} 
+0

Ist dies die einzige Option? Weil mein Denken war - ich habe eine begrenzte Anzahl von Posts - so sagen, es ist 100. So konnte jeder Benutzer nur maximal 100 gemachte Beiträge in ihrem Dokument haben. Wenn ich jedoch die userIds auf dem Post ablege, könnte jeder Post Hunderte, Tausende, Millionen von userId's haben! Kinda macht das Dokument obszön groß – pmanning

+1

Nun, Sie können mit Ihrer aktuellen Struktur fortfahren, aber Sie werden aufgefordert, die Informationen für jeden Beitrag einzeln zu holen. Eine andere Möglichkeit ist, die Daten des Posts in die "likedPosts" des Benutzers zu verteilen, statt nur wahr zu sein - aber nur die Daten, die Sie benötigen, um den Post beispielsweise in einem Feed anzuzeigen. Wenn eine dieser Daten änderbar ist und vom Eigentümer geändert werden kann, haben Sie die Aufgabe, jeden Beitrag in den vom Nutzer gemeldeten Beiträgen zu pflegen. – Callam

+0

hmmm, die Fan-out-Methode scheint interessant. Da es eine begrenzte Anzahl von Posts gibt, die vom Benutzer nicht veränderbar sind und nur kurze Texte sind, könnte dies eine gute Option sein. Werde es ausprobieren. Sonst denke ich, dass ich lieber jeden der Beiträge einzeln holen möchte ... immer noch nicht sicher, wie ich das tun soll – pmanning