2017-03-15 1 views
1

Ich schlage diese TasteFirebase angemeldeten Benutzer nicht schnell genug geladen, bevor segue

override func viewDidLoad() { 
    FIRAuth.auth()?.signIn(withEmail: "[email protected]", password: "password") { 
     (user, error) in 
     // TODO: SET UP A SPINNER ICON 
     print("Logged into hmk") 
     self.performSegue(withIdentifier: "login", sender: self) 
    } 
} 

Wie Sie sehen können, auf Rückruf an einen UITableViewController umleitet. Der populator Code sitzt im initializer von UITableViewController, der einzige Zweck der Schließung ist self.chatsList

Manchmal zu füllen, wenn ich die App testen, ist die UITableViewController leer.

ref.child("users").child(currentUser.uid).observeSingleEvent(of: .value, with: { (snapshot) in 
    guard snapshot.exists() else { 
     print("Error: Path not found") 
     return 
    } 

    let value = snapshot.value as? NSDictionary 
    // Convert a dict of dicts into an array of dicts 
    // You will lose chatID in the process, so be warned 
    // Unless you would like to to keep the data in a struct 
    for (chatIdKey, secondDict) in value?["chats"] as! [String: NSDictionary] { 
     // This only appends metadata for the last chat 
     // Does not load every chat message 
     self.chatsList.append(Chat(chatId: chatIdKey, targetChat: secondDict)) 
    } 
}) 

Aber wenn ich die zurück-Taste drücken, lange genug warten, und wieder anmelden, wird die Tabelle richtig ausgefüllt.

Wie kann ich sicherstellen, dass es jedes Mal korrekt lädt? Ich erwartete die performSegue beim Rückruf würde garantieren, dass wir eine aktuelleUser haben ...

Antwort

1

Ich denke, dass Ihr Beobachter sollte geändert werden. Ich sehe, dass diese Tabellenansicht eine Art von Chat ist, also möchten Sie vielleicht die Referenz am Leben erhalten, während sich der Benutzer in diesem ViewController befindet. Anstatt observeSingleEvent zu verwenden, könnten Sie einfach den Beobachter entfernen, wenn Sie die Ansicht verlassen.

Eine andere Sache ist, dass Sie den Wert beobachten, wenn Sie wahrscheinlich die childAdded beobachten sollten, als ob ein Ereignis hinzugefügt wird, während in der "Chat" -Ansicht der Benutzer es nicht erhalten wird.

Ändern Sie die folgende Zeile und prüfen Sie, ob dies für Sie funktioniert.

ref.child("users").child(currentUser.uid).observe(.childAdded, with: { (snapshot) in 

Hoffe es hilft!

+0

Danke mann! Macht Sinn –

Verwandte Themen