图片来自 Camera/Camera Roll 只上传到 Firebase 一次

Image from Camera/Camera Roll only uploading to Firebase once

编辑 我正在使用 Swift 并使用 Firebase 制作应用程序。在应用程序中,我使用相机和相机胶卷。

用户需要填写 2 个文本字段才能启用下一步按钮,但拍摄或使用照片是可选的。

我已经测试了我的应用程序,只需填写所需的文本字段并创建一个帐户,它工作正常,但如果我添加图像,它只在第一次工作。

这是委托方法代码

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
      print(editedImage)
      selectedImageFromPicker = editedImage
    } else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
      print(originalImage)
      selectedImageFromPicker = originalImage
    }
    if let selectedImage = selectedImageFromPicker {
      accountImageView.image = selectedImage
    }
   dismiss(animated: true, completion: nil)
}

我用来写入 Firebase 数据库和存储的代码是这样的

...
let account = ref.child("accounts").childByAutoId()
...
if selectedImageFromPicker != nil {

  if let tempData = UIImagePNGRepresentation(selectedImageFromPicker!) {
    storageRef.put(tempData, metadata: nil) { (metadata, error) in
      if error != nil {
        print(error!)
        return
      }

      self.accountMetadata = metadata?.downloadURL()

      if let tAccountName = self.accountName,
        let tAccountEmail = self.accountEmail,
        let tProfileImageUrl = metadata?.downloadURL()?.absoluteString {

        account.setValue(["accountName": tAccountName,
                          "accountEmail": tAccountEmail,
                          "accountImage": tProfileImageUrl,
                          "accountHasImage": true])
      }
      print(metadata!)
    }
  }
} else {

  if let tAccountName = accountName,
    let tAccountEmail = accountEmail {
    account.setValue(["accountName": tAccountName,
                      "accountEmail": tAccountEmail,
                      "accountImage": "",
                      "accountHasImage": false])
  }
}
ref.child("users").child((user?.uid)!).child("accounts").child(account.key).setValue(true)
}

目前,当我启动该应用程序并尝试添加一个帐户并第一次使用 camera/camera 滚动并点击提交按钮时,它会正常工作。它创建帐户节点,然后在用户节点中创建对该帐户节点的引用以及存储中的图像。但是,如果我尝试用另一张图片添加第二个帐户,它不会添加帐户节点或存储中的图像,但它会在用户节点中创建对帐户节点的引用(这是一个问题)。

这是个问题,因为在我的 UICollectionView 中,当我尝试拉取所有帐户时,它发现它有一个对 child 的引用,然后尝试拉取那个 child,并且因为 child 实际上不存在,所以我崩溃了。

我不确定我是否使用了正确的 Firebase 术语。我以前的应用程序在结构上与这个应用程序相似,所以我知道它应该可以工作。我唯一改变的是添加相机功能和 Firebase 存储。

由于这条指令,它总是在用户节点中创建对帐户的引用。

ref.child("users").child((user?.uid)!).child("accounts").child(account.key).setValue(true)

你有嵌套的条件,不管selectedImageFromPicker == nil有没有,你都可以处于没有代码执行的状态,最后以用户节点下的账号结束。

尝试将用户节点中的帐户创建移动到与向帐户引用添加节点相同的级别。

...
let account = ref.child("accounts").childByAutoId()
...
if selectedImageFromPicker != nil {

  if let tempData = UIImagePNGRepresentation(selectedImageFromPicker!) {
    storageRef.put(tempData, metadata: nil) { (metadata, error) in
      if error != nil {
        print(error!)
        return
      }

      self.accountMetadata = metadata?.downloadURL()

      if let tAccountName = self.accountName,
         let tAccountEmail = self.accountEmail,
         let tProfileImageUrl = metadata?.downloadURL()?.absoluteString {

        account.setValue(["accountName": tAccountName,
                        "accountEmail": tAccountEmail,
                        "accountImage": tProfileImageUrl,
                        "accountHasImage": true])
>>>    ref.child("users").child((user?.uid)!).child("accounts").child(account.key).setValue(true)
      }
      print(metadata!)
    }
  }
} else {
  if let tAccountName = accountName,
     let tAccountEmail = accountEmail {

    account.setValue(["accountName": tAccountName,
                      "accountEmail": tAccountEmail,
                      "accountImage": "",
                      "accountHasImage": false])
>>> ref.child("users").child((user?.uid)!).child("accounts").child(account.key).setValue(true)
    }
  }
}