2017-07-28 4 views
0

Ich habe eine Benutzerklasse innerhalb meiner FirebaseDB. Es ist, was Sie erwarten würden, eine flache Datei DB würde aussehen: Benutzer-> UID-> Profil-> Schlüssel/Werte. Ich versuche, Best Practices innerhalb meines Codes zu implementieren, damit die Daten vom Benutzermodell in meinem Xcode-Projekt verarbeitet werden können. Wie würde ich die Daten analysieren und als Klassenvariablen in meinem Modell speichern?So analysieren Sie Daten von Firebase und speichern sie anschließend in einem Modell. Swift3 MVC Format

class User { 
 
    private var _username: String 
 
    private var _uid: String 
 
    
 
    var uid: String { 
 
     return _uid 
 
    } 
 
    
 
    
 
    var username: String { 
 
     return _username 
 
    } 
 
    
 
    
 
    init (uid: String, username:String) { 
 
       self._uid = uid 
 
       self._username = username 
 
    } 
 
    
 
    func getUserData() { 
 
     DataService.ds.REF_USERS.observeSingleEvent(of: .value, with: { (snapshot) in 
 
      if let users = snapshot.value as? Dictionary<String, Any>{ 
 
       for (key, value) in users { // We use the for in loop to iterate through each key/value pair in the database which is stored as a dictionary. 
 
        if let dict = value as? Dictionary<String, Any> { // This gets us inside the user ID 
 
         if let profile = dict["profile"] as? Dictionary<String, Any> { // This gets us inside the profile 
 
          if let username = profile["username"] as? String { 
 
           self._uid = key // Stores the UID of the user as the key. 
 
           self._username = username 
 
          } else { 
 
           let username = profile["name"] as? String 
 
           self._uid = key 
 
           self._username = username! 
 
          } 
 
         } 
 
        } 
 
        
 
       } 
 
      }

Dies ist, was ich zu tun versucht, aber ich bin verloren, wie ich in der Klasse, die Datenwerte tatsächlich speichern würde. FYI: Benutzername ist ein Attribut unter Profil.

+0

Ich denke, was Sie versuchen, ist konzeptionell falsch. Sie haben eine Klasse, die einen einzelnen Benutzer und nicht mehrere Benutzer darstellt. Wenn Sie Ihren Code betrachten, versuchen Sie, mehrere Benutzer in einer einzelnen Benutzerklasse zu speichern. Was ist deine letzte Absicht? um ein Array von Benutzern zu erstellen? Wenn dies der Fall ist, sollten Sie in Erwägung ziehen, eine Users-Klasse zu erstellen, in der sich ein Array von "User" -Typ-Elementen befindet. Auf diese Weise können Sie jeden Benutzer zum Array schieben. Wenn dies nicht das ist, was Sie wollen - bitte klären Sie Ihre Frage. – Barackos

+0

Ich möchte nur für einen einzelnen Benutzer speichern, aber ich werde ein anderes für mehrere Benutzer zu einem späteren Zeitpunkt erstellen. Für jetzt möchte ich nur wissen, wie ich eine – Chris

+0

speichern kann Um zu klären, versuche ich eine Benutzerprofilseite zu erstellen. Dies würde bedeuten, ihre Informationen anzuzeigen – Chris

Antwort

0

Sie durchlaufen derzeit die gesamte Benutzerliste in der Datenbank und weisen die Benutzereigenschaften wiederholt zu und überschreiben den Wert aus dem vorherigen Schleifenzyklus.

Um die richtigen Benutzerwerte zu erhalten, müssen Sie den richtigen Pfad zu den Werten kennen. Ich würde vorschlagen, die Benutzer mit ihrer zugewiesenen Firebase-UID zu speichern.

Wenn Sie die richtige UID wissen Sie dann den folgenden Code implementieren können, zu sehen:

func getUserData() { 

    DataService.ds.REF_USERS.child(_uid).child("profile").observeSingleEvent(of: .value, with: { (snapshot) in 
     guard let profileDict = snapshot.value as? [String: Any] else { 
      print("Error fetching user") 
      return 
     } 

     self._username = profileDict["username"] as? String ?? profileDict["name"] as! String 

    }) 
} 

Die Art und Weise, dass „username“ Kraft ist in Ihrem ursprünglichen Code auspackte nicht sicher erscheint, aber ich bin vorausgesetzt, Sie sind sicher, dass es funktionieren wird. Sonst sollte die folgende Zeile geändert werden, um das optional zu entfernen:

self._username = profileDict["username"] as? String ?? profileDict["name"] as! String 
+0

Also habe ich dies implementiert und es hat nicht funktioniert, um die Daten zu setzen, aber ich realisiere die For-Schleife war unnessacary – Chris

+0

Könnten Sie die Implementierung teilen, die Daten werden höchstwahrscheinlich nicht gesetzt, weil die Guard-Anweisung ist nicht zufrieden sein –

Verwandte Themen