2017-05-20 3 views
0

ich diesen Code schreibe:Swift Flow of Control (Function Calls)

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) 
} 

Es scheint, dass die letzte Zeile des Codes in der checkUserImages() Funktion, bevor die die Bilder-Upload in der Funktion uploadImage() beenden aufgerufen wird. Aus diesem Grund sind für die Funktion addImageLinksToDatabase() noch keine Daten verfügbar. Ist das ein Multi-Threading-Fehler und wie gehe ich über den Fluss Fixierung, so dass die Bilder hochladen, bevor addImageLinksToDatabase() genannt wird?

Antwort

1

Dies ist auf Multi-Threading. Die Lösung ist einfach. Verschieben Sie einfach die letzte Codezeile von checkUserImages() an das Ende von uploadImage().

Eg.

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() 
} 

Das sollte perfekt funktionieren.

Verwandte Themen