0

Ich habe dies für zwei Tage gejagt, aber doch bin ich immer noch nicht sicher, warum mein Variable in meinem segue von Anmeldungs ​​View-Controller mit den IRC-View-Controller über das nicht weitergegeben werden Navigationsansicht-Controller.Segue async Firebase Daten durch Navigation (Swift)

Ich habe eine Schaltfläche, die Firebase abfragt, überprüft, ob der Benutzer vorhanden ist und gibt eine Abfrage Firebase Referenz für den Benutzer. Ich möchte dann diese Firebase-Abfrage-Referenz übergeben, wenn es für die Verwendung des Navigationscontroller-Draufsicht-Controllers fertig ist.

Inside my IBAction Login-Button, ich habe:

var tempUserRef: FIRDatabaseReference? 

    channelRef.queryOrdered(byChild: "uid").queryEqual(toValue: uid).observeSingleEvent(of: .value, with: { (snapshot) in 
     if snapshot.exists() { 
      print("uid exist with \(snapshot.childrenCount) number of children") 

      for s in snapshot.children.allObjects as! [FIRDataSnapshot] { 
       tempUserRef = self.channelRef.child(s.key) 
      } 

     } else { 
      print("uid didn't exist") 

      if let name = self.nameField?.text { // 1 
       tempUserRef = self.channelRef.childByAutoId() 

       let channelItem = [ 
        "name": name, 
        "uid": self.uid 
       ] 
       tempUserRef?.setValue(channelItem) 
      } 
     } 
     self.userRef = tempUserRef 
     DispatchQueue.main.async { 
      self.performSegue(withIdentifier: "LoginToChat", sender: tempUserRef) 
      print("passsed \(self.userRef)") 

     } 
    }) 

Hier ist meine segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if "LoginToChat" == segue.identifier { 
      if let navVc = segue.destination as? UINavigationController { 
       if let chatVc = navVc.topViewController as? ChatViewController { 
        chatVc.senderDisplayName = nameField?.text 
        if let userRef = sender as? FIRDatabaseReference { 
         chatVc.userRef = userRef 
         print("passsing \(self.userRef) to \(chatVc)") 
        } 
       } 
      } 
     } 
     super.prepare(for: segue, sender: sender) 
    } 

print-Anweisungen alle auf die Anmeldungs ​​Controller gut aussehen, aber wenn ich auf die Chat-Ansicht zu erhalten Controller, der BenutzerRef ist immer noch Null. Mein Sinn ist also, dass ich die richtigen Übergänge und Übergaben habe, aber dass die Async-Natur der Daten irgendwie nicht mit meinen Übergängen übereinstimmt.

Die Chat-View-Controller wird mit der JSQMessages Bibliothek, wenn das einen Unterschied macht.

Danke für Ihre Hilfe.

EDIT: Basierend auf Feedback habe ich die super.prepare verschoben, aber userRef wird immer noch nicht konsequent eingestellt.

ZWEITE EDIT: paulvs' Vorschlag folgend, ich meine Taste segue entfernt. Allerdings musste ich ein anderes Segment erstellen, das den View-Controller so verbunden hat, dass der Controller wie folgt angezeigt wurde: SO question.

Antwort

1

Setzen Sie den Anruf an super.prepare am Ende der Funktion. Andernfalls wird der Übergang ausgeführt, bevor Sie Ihre Variablen festlegen.

+0

zog ich es, aber es scheint immer noch nicht festgelegt werden. – micyukcha

+0

Ich nehme das zurück. Es ist in 4 der 10 Male passiert, die ich es lief, also gibt es eine rennbedingte Bedingung? Wenn ich alle meine Breakpoints durchlaufe, sieht es so aus, als würden die Zeiten, die durch den Breakpoint innerhalb von viewDidLoad auf der ChatVc gegangen sind, die Variablen setzen. Diejenigen, die es überspringen, tun es nicht. – micyukcha

+0

Sind Sie sicher, dass Sie kein Storyboard-Segment verdrahtet haben _up as well_ als Ihr Aufruf an "performSegue"? Sie sollten entweder das eine oder das andere haben. – paulvs

Verwandte Themen