删除用户后应用程序崩溃

时间:2017-08-09 18:52:06

标签: ios swift firebase

因此,在我的应用程序中,我刚刚创建它,以便用户可以选择删除他们的帐户,并且效果很好。但是,在删除帐户后,应用程序崩溃了。我认为这是因为它试图搜索用户,但它不在那里。

这是我的代码:

let loginController = LoginController()

func deleteAccount() {

    let user = Auth.auth().currentUser
    let userId = Auth.auth().currentUser?.uid
    let databaseUser = Database.database().reference().child("users").child(userId!)

    user?.delete { error in
        if let error = error {
            print(error)
        } else {
            self.present(self.loginController, animated: true, completion: nil)
        }

    }

    databaseUser.removeValue(completionBlock: { (error, ref) in

        if error != nil {

            print(error)
        } else {



        self.present(self.loginController, animated: true, completion: nil)


        } //Without doing this the user's account only gets deleted in the Authentication, not the whole database. I think this is the problem here?

    })

}

提前非常感谢你!

3 个答案:

答案 0 :(得分:1)

使用!隐含地在此行中展开可选

let databaseUser = Database.database().reference().child("users").child(userId!)

您应首先使用nil声明检查guard是否为guard let userId = Auth.auth().currentUser?.uid else { return } let databaseUser = Database.database().reference().child("users").child(userId) [...]

nil

此外,您的代码逻辑可能有误,因为您在使用userId之前获得了<div class="imageeditor"> <select class="form-control m-b-sm"> <option>Select Image Style</option> <option value="image-panel">Panel</option> <option value="image-package-panel">Package</option> <option value="image-open-panel">Open</option> </select> </div> <div class="imageeditor"> <select class="form-control m-b-sm"> <option>Select Image Style</option> <option value="image-panel">Panel</option> <option value="image-package-panel">Package</option> <option value="image-open-panel">Open</option> </select> </div> <div class="imageeditor"> <select class="form-control m-b-sm"> <option>Select Image Style</option> <option value="image-panel">Panel</option> <option value="image-package-panel">Package</option> <option value="image-open-panel">Open</option> </select> </div>

答案 1 :(得分:1)

首先,您需要删除用户数据库,以便执行您需要的let userId = Auth.auth().currentUser?.uid,只有在用户本身位于您的后端时才会激活,然后您继续删除auth

func deleteAccount() {

let user = Auth.auth().currentUser
let userId = Auth.auth().currentUser!.uid
let databaseUser = Database.database().reference().child("users").child(userId)

databaseUser.removeValue(completionBlock: { (error, ref) in

    if error != nil {

        print(error)

    } else {

       user?.delete { error in

          if let error = error {

            print(error) 

          } else {

            self.present(self.loginController, animated: true, completion: nil)

        }

    }
 })
}

如果仍然无法使用调试工具跟踪用户的生命周期....

答案 2 :(得分:0)

代码顺序并不理想,因为删除用户也会将其记录下来。因此代码可能在用户注销后尝试访问用户节点

还要记住,Firebase是异步的,知道函数已完成的唯一方法是当闭包内的代码执行时,即在这种情况下,databaseUser.removeValue 可能在删除用户之前触发或有时它可能没有。

代码比互联网更快,因此最好利用闭包,以便您知道什么时候可以安全继续。

尝试这个序列;注意到在我们确定删除了用户节点中的数据之前,我们不会尝试删除Firebase用户。可以使用更多的错误检查,但你明白了。

let userRef = self.ref.child("users").child(uid)
userRef.setValue(nil, withCompletionBlock: { snapshot in
    Auth.auth().currentUser?.delete(completion: { err in
        if err != nil {
            print(err?.localizedDescription)
        }
    })
})