swift2 SetValue的行为不符合预期

ia2d9nvy  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(217)

我在一个用Swift编写的iOS应用程序中使用Firebase。

static func createUserRecord(uid: String, user: User){
       let userDictionary = user.getJSON()
       self.usersRef.child(uid).setValue(userDictionary)
    }

在我发布应用程序之前,这段代码运行良好,但在发布应用程序后,我无法再添加用户记录。应用程序的所有其他功能都运行良好,包括保存和检索一些数据。有人能发现这段代码中的错误吗?
即使路径不存在,setValue也能正常工作吗?例如,如果路径a/b/存在,而我调用了a/b/c.child('d').setValue("abcd"),这能正常工作吗?

axzmvihb

axzmvihb1#

如果路径还不存在,调用setValue()将创建该路径。
根据数据库(或您的安全规则),您的user.getJSON()更有可能包含无效的内容。
您将需要附加一个完成块来检测此情况。
下面是StackOverflow文档中的一个执行此操作的示例:
读操作可能无法工作的常见原因是安全规则拒绝该操作,例如,您未通过身份验证(默认情况下,数据库只能由通过身份验证的用户访问)。
你可以在控制台输出中看到这些违反安全规则的行为。但是很容易忽略这些。你也可以在自己的代码中处理它们,使它们更明显地可见,这在开发过程中特别有用(因为你的JSON、规则和代码经常变化)。
要在iOS上检测失败的读取,您必须实现观察器的withCancel块:

ref!.child("notAllowed").observe(.value, with: { (snapshot) in
    print("Got non-existing value: \(snapshot.key)")
}, withCancel: { (error) in
    print(error)
})

相关问题