2017-08-19 1 views
1

Je dois télécharger plusieurs images dans une API à la fois. J'utilise Alamofire pour télécharger des images et l'API ne permet qu'une seule image à télécharger par requête.Seule la dernière image du tableau est téléchargée avec Alamofire Swift 3

J'ai une série d'images à télécharger et je passe par la matrice et fait une demande à chaque fois. Chaque image semble télécharger correctement mais quand je vérifie la base de données seulement la dernière image a été téléchargée. Chaque appel imprime une réponse avec le code d'état 200 et imprime "SUCCESSFUL" quand il est terminé, mais seulement le dernier dans le tableau télécharge réellement.

for (index, image) in self.imageArray.enumerated() { 
     self.uploadImages(photoIndex: index, photo: image.image, fileName: image.imageName, completion: { (true) in 
      print("SUCCESSFUL") 
     }) 
} 

J'ai aussi essayé d'utiliser un DispatchQueue, mais cela ne fonctionne pas non plus:

let serialQueue = DispatchQueue(label: "serialQueue") 

Et à l'intérieur de la boucle

serialQueue.async { 
//self.uploadImages... 
} 

J'ai essayé quelques petites choses , sans succès. Comment pourrais-je résoudre ce problème?

Aussi, voici mes uploadImages fonctionnent

func uploadImages(photoIndex: Int, photo: UIImage, fileName: String, completion: @escaping (_ Success : Bool?) ->()) 
    { 
     var success: Bool? = nil 

     let url : String? = //url 
     // define parameters 
     let parameters = [ 
      "photoIndex": "\(photoIndex)"] 

     Alamofire.upload(multipartFormData: { multipartFormData in 
      if let imageData = UIImageJPEGRepresentation(photo, 1) 
      { 
       multipartFormData.append(imageData, withName: "photo", fileName: fileName, mimeType: "image/png") 
      } 

      for (key, value) in parameters { 
       multipartFormData.append((value.data(using: .utf8))!, withName: key) 
      }}, to: url!, method: .post, 
       encodingCompletion: { encodingResult in 
        switch encodingResult { 
        case .success(let upload, _, _): 
         upload.response { [weak self] response in 
          guard let strongSelf = self else { 
           return 
          } 
          success = true 
          debugPrint(response) 
          completion(success) 

         } 
        case .failure(let encodingError): 
         print("error:\(encodingError)") 
         } 
     }) 
    } 

Répondre

0

Utiliser les données de formulaire multipart pour télécharger le tout fichier média ci-dessous est l'extrait de code pour télécharger plusieurs vidéos

for (key , value) in arrMediaUpload { 
         if let image = value as? UIImage { 
          if let imageData = UIImageJPEGRepresentation(image,0.9) { 
           print("key => \(key)") 
           multipartFormData.append(imageData as Data, withName: key, fileName: "\(NSDate().timeIntervalSince1970).jpg", mimeType: "image/*") 
          } 
         } 
        } 
+0

Merci. Je ne pense pas que ce soit mon problème cependant. J'ai ajouté le code pour ma fonction qui télécharge l'image. Cela fonctionne, mais quand je l'utilise dans une boucle, seule la dernière image de la boucle est téléchargée. –

0

Je ne suis pas bon dans Swift alors prenez cette réponse avec un grain de sel mais je ne vois pas si vous ajoutez de nouvelles clés à votre dictionnaire. Donc, puisqu'il n'y a qu'une seule clé, il n'y aurait qu'une seule valeur. Par conséquent, la boucle for ne sera effectuée qu'une seule fois.