Похоже, что весь код в вопросе находится внутри переменной AuthData.
Проблема вызвана тем, что одна из пар ключ: значение в переменной dict является пустой строка. Я уменьшу это немного, чтобы высветить проблему. Вот исходный код с моими добавленными комментариями:
if let AuthData = AuthDataResult {
var dict : Dictionary < String, Any> = [
"uid": AuthData.user.uid,
"username": self.UsernameTextField.text!,
"email": AuthData.user.email,
"ProfileImageUrl": "", // <--- Profile ImageUrl is an empty string
]
imageReference.putData(uploadData, metadata: metaDataForImage) { (meta, err) in
if let err = err{
} else {
imageReference.downloadURL { (url, err) in
if let err = err{
} else {
let urlString = url?.absoluteString
}
//The ProfileImageUrl key: value pair within the **dict** var is an
// empty string at this point, so no url is written.
let dbRef = Database.database().reference()
let usersRef = dbRef.child("users").child(AuthData.user.uid)
usersRef.updateChildValues(dict, withCompletionBlock: { (error,ref) in
if error == nil {
print("Done")
return
}
//note that if an error occurs, the code silently fails
Чтобы исправить, заполните dict данными, которые вы хотите записать.
Вот исправленный раздел кода, который включает проверку ошибок и заполнение ProfileImageUrl с URL-адресом для загрузки и последующей записью в Firebase.
imageReference.downloadURL { (url, error) in
if let err = error {
print(err.localizedDescription)
return
}
guard let validUrl = url else {
print("url was not valid")
return
}
let urlString = validUrl.absoluteString
dict["ProfileImageUrl"] = urlString //update the dict with the url
let dbRef = Database.database().reference()
let usersRef = dbRef.child("users").child(AuthData.user.uid)
usersRef.updateChildValues(dict, withCompletionBlock: { error, ref in
if let err = error {
print(err.localizedDescription)
return
}
print("Successfully wrote auth data and url")
})
}