ios - Firebase:在注销之前保存数据

标签 ios swift firebase firebase-realtime-database firebase-authentication

在我的 iOS 应用程序中,我想尝试在用户退出之前保存一段用户数据。

--更新了具有相同问题的代码。在“FELL INTO COMPLETION BLOCK”之前打印“USER HAS BEEN LOGGED OUT”。

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 的完成 block 内,那么这对我来说是完全有意义的。

有什么解释吗?

已更新 ---------------------------------------------------------- -------------------------- 我已经弄清楚这里的问题了。 rootRef.child.setValue 内容位于我为便于在整个项目中使用而创建的通用设置值函数内部。当我获取该函数的内容(您在上面看到的 setValue 代码)并单独运行它(而不是在单独的函数调用内)时,问题就消失了,并且 print 语句的顺序正确。我相信这意味着我的问题是由调用堆栈引起的。注销用户是调用堆栈上的最后一件事,因此它是调用堆栈上的第一件事 - 第一个执行的事情。

下面的代码应该演示这个问题

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

最佳答案

您可以使用 OnCompleteListener 监听是否成功将数据添加到 Firebase 数据库,并在数据更新成功后注销。如果保存数据时出现任何错误,请通知用户并进行相应操作。

关于ios - Firebase:在注销之前保存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39807425/

相关文章:

Swift 协议(protocol)通用作为函数返回类型

firebase - Cloud Firestore 中的数据匹配功能与 Cloud Functions 函数

ios - 用于 IPA 的 Xamarin.Form iOS 项目构建

iphone - 获取节点 :withName: method of soap is called more than 2 million times when parsing some big xml web service

ios - 困惑 : Non-nil value unwrapped nil, if-let 子句在 nil 值上执行 block

javascript - Firebase 规则 : Problem with role based authentication in groups and . 其中()

ios - IOS后台运行代码

iphone - IOS 文字转语音

ios - SpriteKit 检测节点是否从父节点移除

ios - 应用程序本地化 (IOS)