2017-12-12 3 views
0

Firebase Storageに画像をアップロードし、そのパスのダウンロードURLを返す機能を作成しようとしています。機能を使用してFirebaseストレージからdownloadUrlを返そうとしています

func uploadImage(to reference:StorageReference, image:UIImage) -> URL? { 

     let imageData = UIImageJPEGRepresentation(image, 0.2) 
     let metadata = StorageMetadata() 
     metadata.contentType = "image/jpeg" 
     var downloadURL = metadata.downloadURL() 
     reference.putData(imageData!, metadata: metadata) { (metadata, error) in 
      if error != nil { 
       print("Couldnt upload due to \(String(describing: error))") 
      } 
      downloadURL = metadata?.downloadURL() 
     } 
     return downloadURL! 
    } 

私はdownloadUrlは常にnilを返すように私が望む結果を得るように見えることはできません。

これは、関数がどのように見えるかです。私は間違って何をしていますか?

答えて

1

ここでの問題は、アップロードが完了する前に関数が戻ることです。言い換えれば、あなたの関数は単純なURLではなくコールバックを返す必要があります。何かのような -

func uploadImage(to reference:StorageReference, image:UIImage, completion: @escaping (URL?) -> Void) { 
    let imageData = UIImageJPEGRepresentation(image, 0.2) 
    let metadata = StorageMetadata() 
    metadata.contentType = "image/jpeg" 
    var downloadURL = metadata.downloadURL() 
    reference.putData(imageData!, metadata: metadata) { (metadata, error) in 
     if error != nil { 
      print("Couldnt upload due to \(String(describing: error))") 
      completion(nil) 
     } else { 
      if let downloadUrl = metadata?.downloadURL() { 
       completion(downloadUrl) 
      } else { 
       completion(nil) 
      } 
     } 
    } 
} 
+0

こんにちはクリス、返信ありがとうございます。それで、UIImageをパラメータにとり、Storageにアップロードし、アップロードが完了した後に最終的にURLを返す関数を使用できる他の方法はありますか? – AAAM

+0

上記の例ではURLが与えられますが、必ずコールバックを使用する必要があります。よくわからない場合は、ClosureのSwiftのドキュメントをご覧ください。https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html –

+0

https:// stackoverflowもご覧ください。より一般的な説明については、http://www.google.com/support/bin/answer.py?answer=14220321/how-do-i-return-as-asynchronous-call/14220323#14220323を参照してください。 –

関連する問題