2017-02-23 15 views
1

私はSwiftを使ってFirebaseを使ってアプリケーションを作っています。アプリでは、カメラロールとカメラロールを使用します。Camera/Cameraの画像はFirebaseに一度だけアップロードする

ユーザは、次のボタンを有効にするために2つのテキストフィールドを入力する必要がありますが、画像の撮影または使用はオプションです。

必要なテキストフィールドに入力してアカウントを作成するだけでアプリをテストしましたが、正常に動作しますが、画像を追加すると初めて動作します。

これは私が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) 
} 

ですデリゲートメソッドのコード

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

ですアカウントを追加して、初めてカメラ/カメラロールを使用し、送信ボタンをタップすると正常に動作します。アカウントノードを作成し、そのアカウントノードへの参照をユーザーノードに作成し、ストレージ内のイメージを作成します。しかし、2番目のアカウントに別の画像を追加しようとすると、アカウントノードまたは画像がストレージに追加されるのではなく、ユーザーノードのアカウントノードへの参照が作成されます(これは問題です)。

私のUICollectionViewでは、すべてのアカウントを取得しようとすると、子への参照があることがわかり、その子をプルしようとしています。クラッシュする

適切なFirebaseの用語を使用しているかどうかはわかりません。私の以前のアプリは、このアプリと構造が似ているので、うまくいくはずです。私が変更したのは、カメラ能力とFirebase Storageを追加することだけです。

答えて

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) 
    } 
    } 
} 
関連する問題