0

In meiner iOS App möchte ich versuchen, ein Stück Benutzerdaten zu speichern, kurz bevor der Benutzer abmeldet.Firebase: Speichern von Daten kurz vor dem Abmelden

- aktualisierter Code mit demselben Problem. "USER HAT SICH ABGESCHICKT" druckt vor "FALL IN COMPLETION BLOCK".

let tryToLogout = { 
    try! FIRAuth.auth()!.signOut() 
    print("USER HAS BEEN LOGGED OUT") 
} 

rootRef.child(path).setValue(value, withCompletionBlock: { (_,_) in 
    print("FELL INTO COMPLETION BLOCK") 
    tryToLogout() 
}) 

Leider bekomme ich manchmal eine Berechtigung verweigert, die SetValue Versuch. Ich nehme an, dass hier der Benutzer sich durch das Abmelden deauthed wird, bevor der SetValue greifen kann. Das wäre für mich völlig verständlich, wenn der Aufruf von signOut() nicht eindeutig im Completion-Block von setValue enthalten wäre.

Eine Erklärung?

AKTUALISIERT --------------------------------------------- --------------------------- Ich habe das Problem hier irgendwie herausgefunden. Der rootRef.child.setValue-Stuff befindet sich in einer allgemeinen Set-Value-Funktion, die ich für die einfache Verwendung in meinem Projekt eingerichtet habe. Wenn ich den Inhalt dieser Funktion (den setValue-Code, den Sie oben sehen) nehme und ihn selbst ausführe (nicht innerhalb eines separaten Funktionsaufrufs), verschwindet das Problem und die Druckanweisungen befinden sich in der richtigen Reihenfolge. Ich glaube, das bedeutet, dass mein Problem durch den Call-Stack verursacht wurde. Das Abmelden des Benutzers war das letzte auf dem Aufruf-Stack, und daher war es das erste, was vom Call-Stack abging - das erste, was ausgeführt wurde.

Der folgende Code sollte dieses Thema zeigen

func setFireBaseValue(path: String, value: NSObject, completionCode:()) { 
    getRootRef().child(path).setValue(value, withCompletionBlock: { (_,_) in 
     print("FELL INTO A COMPLETION BLOCK") 
     completionCode 
    }) 
} 

let tryToLogout = { 
    try! FIRAuth.auth()!.signOut() 
    print("USER HAS BEEN LOGGED OUT") 
} 

setFireBaseValue(path: "test", value: "hi" as NSString, completionCode: tryToLogout()) 
+0

Der Block Abschluss wird nur einmal die 'setValue() aufgerufen werden' wurde auf dem Server ausgeführt und der Client Bestätigung empfangen. Ich sehe keinen Weg, der eine verweigerte Berechtigung auslösen könnte. Sie können möglicherweise genau sehen, was passiert, wenn Sie die [Debug-Protokollierung aktivieren] (https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_database.html#add018db6d76362436734f66daa471256). –

+0

Ich habe einen Ausdruck ("FELL IN COMPLETION BLOCK") als erste Zeile innerhalb des Completion Blocks hinzugefügt. Dann entfernte ich das ZeichenOut() und kapselte es innerhalb einer Schließung mit einem Ausdruck ("USER SIGNED OUT"). Dann habe ich den Abschluss im Completion-Block aufgerufen. Wenn all dies ausgeführt wird, druckt der "USER SIGNED OUT" ausnahmslos vor dem "FELL IN COMPLETION BLOCK". Es muss sein, dass die signOut() Methode vor dem Abschlussblock aufgerufen wird, ja? – user3915477

+0

Das beweist, dass "tryToLogout" aufgerufen wird, bevor der Completion-Block aufgerufen wird. Es muss von woanders aufgerufen werden. Gibt es eine Möglichkeit, den Callstack von "tryToLogout" aufzurufen, um zu sehen, woher er kommt? –

Antwort

0

Sie können für die erfolgreiche Hinzufügen von Daten zu Feuerbasis Datenbank und melden Sie sich nach updation erfolgreich Daten verwenden OnCompleteListener zu hören. Wenn beim Speichern der Daten ein Fehler aufgetreten ist, benachrichtigen Sie den Benutzer darüber und fahren Sie entsprechend fort.

0

Versuchen Sie es mit: -

rootRef.child(path).setValue(value, withCompletionBlock: { (err,ref) in 

if err == nil && ref == nil{ 
    try! FIRAuth.auth()!.signOut() 
    } 
}) 
Verwandte Themen