2017-02-23 32 views
1

编辑 我正在制作一个使用Swift并使用Firebase的应用。在应用程序中,我使用相机以及相机胶卷。来自相机/相机的图片只能上传到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) 
} 

我使用写火力地堡数据库和存储因而

... 
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) 
} 

目前的代码,正在发生的事情是,当我启动应用程序,并尝试添加一个帐户,并在第一次使用相机/相机胶卷,然后点击提交按钮它将正常工作。它创建帐户节点,然后创建用户节点中该帐户节点的引用以及存储中的映像。但是,如果我尝试添加第二个帐户与另一张图片,它不会添加帐户节点或存储中的图像,但它确实创建用户节点中的帐户节点的引用(这是一个问题)。

这是一个问题,因为在我的UICollectionView中,当我尝试拉取所有帐户时,它看到它有一个对一个孩子的引用,然后试图拉那个孩子,并且因为那个孩子实际上并不存在得到一个崩溃。

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

回答

1

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

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) 
    } 
    } 
} 
相关问题