0

私を満足させた回答は見つかりませんでした。イメージをFirebaseストレージにアップロードし、imageUrlをFirebaseデータベースに保存します。方法:画像をアップロードイメージのFirebase Storageへのアップロードを完了し、イメージベースをFirebaseデータベースに保存する方法

 var imageUrls = [String]() 

    func uploadImagesToStorage(imagesArray: [UIImage]) { 


    for i in imagesArray { 

     guard let uploadData = UIImageJPEGRepresentation(i, 0.3) else { return } 
     let fileName = NSUUID().uuidString 

     FIRStorage.storage().reference().child("post_Images").child(fileName).put(uploadData, metadata: nil) { (metadata, err) in 

      if let err = err { 
      return 
      } 

      guard let profileImageUrl = metadata?.downloadURL()?.absoluteString else { return } 
      self.imageUrls.append(profileImageUrl) 

     }.resume() 

    } //..End loop 
     saveToDatabaseWithImageUrl(imageUrls: imageUrls) 

uploadImagesToStorage([UIImage] imagesArray)で動作します。このメソッドは、アップロードしたい画像を含む配列を引数として取得します。画像をアップロードしている間、firebaseが私に与えるメタデータからimageUrl情報をダウンロードして、そのimageUrlをimageUrlsアレイに保存しています。 forループは、すべての単一のイメージのimageUrl情報を保存するために必要です。イメージがアップロードされ、imageUrls ArrayにimageUrl情報が入力されたら、関数func saveToDatabaseWithImageUrl(imageUrls:[String])を呼び出して、imageUrlをデータベースに保存します。 Firebaseの確認画像はFirebaseストレージに保存されますが、imageUrlはFirebaseデータベースに保存されません。私のコードをデバッグしている間、私は、この動作の理由は、画像がアップロードされている間にコードが次の行にジャンプしていることに気付きました。したがって、空のimageUrls配列を持つsaveToDatabaseWithImageUrlsを呼び出します。私は[Documentation] [1]を読んで、.resume()メソッドを使ってアップロードを管理しようとしました。それでもsaveToDatabaseWithImageUrlメソッドにジャンプしました。アップロードが完了し、次のコード行が実行されることを保証する方法がわかりません。ご協力いただきありがとうございます。

答えて

1

あなたの.child("post_Images").child(fileName).putの成功ブロックが非同期に呼び出されるために起こります。残りのコードは同期します。あなたのforは写真のアップロードを開始し、それ以降はURLをデータベースに保存しますが、アップロードの完了を待たずにURLは空です。

私はあなたにDispathGroup

//Create DispatchGroup 
let fetchGroup = DispatchGroup() 

for i in imagesArray { 
    guard let uploadData = UIImageJPEGRepresentation(i, 0.3) else { return } 

    let fileName = NSUUID().uuidString 
    //Before every iteration enter to group 
    fetchGroup.enter()   
    FIRStorage.storage().reference().child("post_Images").child(fileName).put(uploadData, metadata: nil) { (metadata, err) in 
     if let err = err { 
     fetchGroup.leave() 
     return 
     } 

     guard let profileImageUrl = metadata?.downloadURL()?.absoluteString else { return } 
     self.imageUrls.append(profileImageUrl) 
     //after every completion asynchronously task leave the group 
     fetchGroup.leave() 
    }.resume() 
} 

に基づいて最適なソリューションを与えるとIDマジック

fetchGroup.notify(queue: DispatchQueue.main) { 
    //this code will call when number of enter of group will be equal to number of leaves from group 
    //save your url here 
    saveToDatabaseWithImageUrl(imageUrls: imageUrls) 
} 

このソリューションでは、スレッドをブロックしていない知っている、すべてがここに非同期で動作します。

+0

お返事ありがとうございます。次のエラーメッセージが表示されました未解決の識別子の使用convertPhotoToPngData –

+1

あなたは自分のコードを参照してください。画像をアップロードすると機能します空のimageUrlをアップロードしてデータベースに保存する際に次のコード行にジャンプするという問題があります –

+0

アップロードを完了するためにどうすればいいですか –

関連する問題