2017-05-20 6 views
0

私はこのコードを書いています:スウィフトフロー(ファンクションコール)

func checkUserImages() { 
    if (self.imagesAdded.count == 0) { 
     self.success() 
    } else { 
     if (self.checkNetwork() == false) { 
      self.displayNoNetworkConnection() 
     } else if (self.checkUser() == false) { 
      print("THERE IS NO CURRENT USER") 
     } else { 
      self.progressHUD = MBProgressHUD.showAdded(to: self.view, animated: true) 
      self.progressHUD.label.text = "Loading" 
      if (self.imagesAdded.contains("Header")) { 
       print("CALL 1") 
       self.uploadImage(image: self.headerImageView.image!, imageType: "headerPicture") 
      } 
      if (self.imagesAdded.contains("Profile")) { 
       print("CALL 2") 
       self.uploadImage(image: self.profileImageView.image!, imageType: "profilePicture") 
      } 
      self.addImageLinksToDatabase() 
     } 
    } 
} 

func uploadImage(image: UIImage, imageType: String) { 
    let imageUploadData = image.mediumQualityJPEGData 
    storageReference.child("users").child("\(imageType)s").child("\(currentUser!.uid)\(imageType)").putData(imageUploadData, metadata: nil) { (metadata, error) in 
     if let error = error { 
      self.progressHUD.hide(animated: true) 
      self.displayError(title: "Error", message: error.localizedDescription) 
     } else { 
      self.imageData[imageType] = metadata?.downloadURL()?.absoluteString 
     } 
    } 
} 

func addImageLinksToDatabase() { 
    databaseReference.child("users").child(currentUser!.uid).child("userDetails").updateChildValues(self.imageData, withCompletionBlock: { (error, ref) in 
     if let error = error { // Checks for an error 
      self.progressHUD.hide(animated: true) 
      self.displayError(title: "Error", message: error.localizedDescription) 
     } else { 
      self.success() 
     } 
    }) 
} 

func success() { 
    self.progressHUD.hide(animated: true) 
    self.performSegue(withIdentifier: "successfulAddPhotosSegue", sender: self) 
} 

画像がuploadImage()機能でアップロードが完了する前checkUserImages()関数内のコードの最後の行が呼び出されることが表示されます。このため、まだaddImageLinksToDatabase()機能のデータは準備されていません。これはマルチスレッドエラーですか?addImageLinksToDatabase()より前にアップロードされるようにフローを修正する方法を教えてください。

答えて

1

これはマルチスレッドによるものです。解決策は簡単です。 checkUserImages()の最後のコード行をuploadImage()の最後に移動してください。

例:

func uploadImage(image: UIImage, imageType: String) { 
    let imageUploadData = image.mediumQualityJPEGData 
    storageReference.child("users").child("\(imageType)s").child("\(currentUser!.uid)\(imageType)").putData(imageUploadData, metadata: nil) { (metadata, error) in 
     if let error = error { 
      self.progressHUD.hide(animated: true) 
      self.displayError(title: "Error", message: error.localizedDescription) 
     } else { 
      self.imageData[imageType] = metadata?.downloadURL()?.absoluteString 
     } 
    } 
    self.addImageLinksToDatabase() 
} 

これは完全に動作するはずです。

関連する問題