2017-02-23 65 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) 
    } 
    } 
} 
相關問題