0

在我的iOS應用程序中,我想嘗試在用戶註銷之前保存一段用戶數據。Firebase:在登出前保存數據

- 具有相同問題的更新代碼。在「填充完成塊」之前打印「用戶已登錄」。

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() 
}) 

不幸的是,我有時會收到上的setValue企圖否認權限。我認爲這裏發生的事情是用戶通過在setValue佔據之前退出而取消授權。如果不是因爲signOut()調用明顯位於setValue的完成塊內部,這對我來說完全有意義。

任何解釋?

UPDATED --------------------------------------------- --------------------------- 我有點想出了這個問題。 rootRef.child.setValue是我爲了在整個項目中易於使用而創建的一個常規設置值函數。當我使用該函數的內容(上面看到的setValue代碼)並單獨運行它(不在單獨的函數調用中)時,問題消失並且打印語句按正確順序排列。我相信這意味着我的問題是由調用堆棧造成的。註銷用戶是調用堆棧中的最後一件事,因此它是調用堆棧中的第一件事情 - 首先執行。

下面的代碼應該證明這個問題

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

建成塊纔會被調用一次'的setValue()'已經在服務器上執行,客戶端已經接收的確認。我認爲沒有辦法可以觸發拒絕許可。如果您[啓用調試日誌記錄](https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_database.html#add018db6d76362436734f66daa471256),則可能會看到到底發生了什麼。 –

+0

我添加了一個print(「FELL INTO COMPLETION BLOCK」)作爲完成塊內的第一行。然後我刪除了signOut()並將其封裝在包含打印的封閉內(「USER IS SIGNED OUT」)。然後我在完成塊內部調用閉包。當所有這些都被執行時,「用戶已簽出」打印在「完成填充塊」之前。它必須是在完成塊之前調用signOut()方法,是的? – user3915477

+0

這證明'tryToLogout'在調用完成塊之前被調用。它必須從其他地方調用。在調用tryToLogout'時查看調用堆棧的任何方法來查看它來自哪裏? –

回答

0

您可以使用OnCompleteListener監聽成功添加數據的火力點數據庫,併成功的數據更新用後註銷。如果在保存數據時出現任何錯誤,請通知用戶,並據此進行處理。

0

嘗試使用: -

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

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