2017-07-05 1 views
0

Je suis en œuvre une application iOS et d'essayer de faire ce qui suit lors du téléchargement d'une photo à un serveur:ne peux pas comprendre comment gérer MBProgressHUD et l'expédition

  • processus de téléchargement Démarrer avec Alamofire
  • Afficher un progrès indicateur avec MBProgressHUD
  • Lorsque le téléchargement est terminé, cacher l'indicateur de progression
  • en fonction de la réponse du serveur, afficher un message (réussite ou échec) alors la vue rejeter

Et je ne suis pas en mesure de réaliser cela, en particulier sur le rejet de la vue après l'affichage du message de réponse pendant 2 secondes. Voici mon code. Comment procéderiez-vous s'il vous plaît? Merci.

class ShareViewController: UIViewController { 
    var progressHUD: MBProgressHUD! = nil 

    func sendToServer(image: UIImage, imageName: String) { 

     Alamofire.upload(multipartFormData: { multipartFormData in 
      multipartFormData.append(jpgImageData!, withName: "photos",fileName: fname, mimeType: mime) 
      for (key, value) in parameters { 
       multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) 
      } 
     }, 
         to:url!) 
     { (result) in 
      switch result { 
      case .success(let upload, _, _):   
       upload.uploadProgress(closure: { (progress) in  
        DispatchQueue.main.async(execute: { 
         self.progressHUD.show(animated: true) 
         self.progressHUD.progress = (Float(progress.fractionCompleted)) 
         self.progressHUD.hide(animated: true, afterDelay: 3) 
        }) 

       }) 
       upload.responseJSON { response in 
        if response.response?.statusCode == 200{ 
         if let result = response.result.value { 
          var message = String() 
          message = "200, OK" 

          self.progressHUD.label.text = message 
          self.progressHUD.show(animated: true) 
          self.progressHUD.hide(animated: true, afterDelay: 2) 

          DispatchQueue.main.async(execute: { 
           self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 
          }) 
         } 
        } 
        else{ 
         var message = String() 
         message = "Not 200, NOK" 

         self.progressHUD.label.text = message 
         self.progressHUD.show(animated: true) 
         self.progressHUD.hide(animated: true, afterDelay: 2) 

         DispatchQueue.main.async(execute: { 
          self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 
         }) 
        } 
       } 

      case .failure(let encodingError): 
       print(encodingError) 
       var message = String() 
       message = "Failure, NOK" 

       self.progressHUD.label.text = message 
       self.progressHUD.show(animated: true) 
       self.progressHUD.hide(animated: true, afterDelay: 2) 

       DispatchQueue.main.async(execute: { 
        self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 
       }) 
      } 
     } 
    } 
} 

Répondre

0

J'ai trouvé une solution qui fonctionne très bien. Le dernier DispatchQueue, qui rejette la vue, n'est pas exécuté immédiatement après 2 secondes. Voici le code:

DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 
           self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 
          } 

J'espère que cela aide.