2016-12-20 3 views
1

私は比較的早くFirebaseに新しいですが、私は間違いなく奇妙な問題に直面しています。デバッガで混乱した後に起こっていることは、以下の関数が行をスキップするなど奇妙な動作をしているように見えることです。storageRef.put()Firebaseにファイルをアップロードするとコード行がスキップされますか?

これは何が起こっているのか、この関数はユーザが保存ボタン。デバッガでは、storageRefが呼び出されますが、if else文は呼び出されません。その後、関数が適切に初期化されていないオブジェクトを返すと、適切な値を持つif elseステートメントに戻ります。返され、データベースにアップロードされた値が既に間違っているので、それは遅すぎます。

func toAnyObject() -> [String : Any] { 
     beforeImageUrl = "" 
     let storageRef = FIRStorage.storage().reference().child("myImage.png") 
     let uploadData = UIImagePNGRepresentation(beforeImage!) 
     storageRef.put(uploadData!, metadata: nil) { (metadata, error) in 
      if (error != nil) { 
       print(error) 
      } else { 
       self.beforeImageUrl = (metadata?.downloadURL()?.absoluteString)! 
       print("upload complete: \(metadata?.downloadURL())") 
      } 
     } 

     let firebaseJobObject : [String: Any] = ["jobType"   : jobType! as Any, 
               "jobDescription" : jobDescription! as Any, 
               "beforeImageUrl" : beforeImageUrl! as Any,] 
     return firebaseJobObject 
    } 

答えて

0

あなたのアプローチの変更をここで検討してください。ボタンターゲットアクションは、即時応答が必要なソリューションの典型です。

ただし、上記の- (FIRStorageUploadTask *)putData:(NSData *)uploadDataメソッドのような他のプロセスを(ネットワーク経由で)実行する場合は、サーバー側のメソッドが値を返すたびに、遅延アクションを実行するために何らかの委任形式を使用する必要があります。

上記の方法を使用するときは、大きなファイルでは使用できません。 - (FIRStorageUploadTask *)putFile:(NSURL *)fileURLメソッドを使用する必要があります。

putを成功または失敗した場合にのみフォローアップアクションが発生するように、ソリューションを再作成することをお勧めします。ネットワークトラフィックとは、アップロードに時間がかかることを意味します。 putが成功または失敗で完了していることを確認するには、完了ブロック内の適切な場所にブレークポイントを追加し、ネットワークアクセスのない/と両方のコードフローをテストするデバイスでメソッドを実行します。

関連する問題