Grâce à la migration vers Swift 3, je trouve difficile de compiler mon projet utilisant Alamofire.
Le problème se produit lors du téléchargement de multipartFormData:
Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
multipartFormData in
.
.
.
})
Référence ambiguë au membre 'upload (_: to: method: headers :)'
Toute aide très appréciée, merci d'avance!
RÉSOLU:
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(fileData, withName: "file_pack", fileName: "file_pack", mimeType: "text/plain")
for (key, value) in self.parameters {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, with: URL2, encodingCompletion: { (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
self.delegate?.showSuccessAlert()
print(response.request) // original URL request
print(response.response) // URL response
print(response.data) // server data
print(response.result) // result of response serialization
// self.showSuccesAlert()
self.removeImage("frame", fileExtension: "txt")
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
case .failure(let encodingError):
self.delegate?.showFailAlert()
print(encodingError)
}
})
C’est ainsi que la méthode de téléchargement devrait être mise en œuvre dans Swift 3
Par exemple, en utilisant Alamofire 4.0.0 dans Swift:
(assurez-vous que vous êtes prêt pour la version 4.0.0 car il semble que vous n'ayez pas encore mis à jour votre Alamofire)
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, to: URL, encodingCompletion: { (result) in
// code
})
ou
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, with: URL, encodingCompletion: { (result) in
// code
})
Donc, headers
doit être passé par une requête d'URL:
let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
Essayez celui-ci et définissez l'URL comme @ pedrouan , dit.
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
}, to: url)
{ (result) in
//result
}
Pour Swift 3 et Alamofire ~ 4.3.0
Si quelqu'un comme moi essayait d'obtenir l'objet requête de manière synchrone (sans utiliser de verrous ni de dispatch_groups), vous pouvez utiliser cette approche:
// outer function
...
let string = "string to send"
let multipartFormData = MultipartFormData()
multipartFormData.append(string.data(using: .utf8)!, withName: "str")
guard let data = try? multipartFormData.encode() else {
// fail appropriately
}
let request = sessionManager.upload(data,
to: url,
method: .post,
/* this is VERY IMPORTANT LINE */ headers: ["Content-Type" : multipartFormData.contentType])
request.validate()
// do whatever you need with request
Veuillez noter que vous devez définir Content-Type
_ en-tête de votre part multipartFormData
car il contient des limites.
Si vous n'avez pas besoin d'avoir votre demande objet de manière synchrone, l'autre réponse avec
Alamofire.upload(multipartFormData: { (multipartFormData) in
fonctionne comme prévu. En cas de succès du codage des données, l'objet de demande sera renvoyé lors de la fermeture du rappel.
NOTE IMPORTANTE: Si vous utilisez la méthode que j'ai décrite, votre thread sera bloqué (dans la plupart des cas, vous êtes probablement dans le thread principal) pour copier et encoder vos données. Donc, ne l'utilisez pas pour les gros fichiers ou quoi que ce soit. C'est exprès dans Alamofire.
Dans Swift 3, essayez de définir multipartFormData comme l'a indiqué @DCDC dans sa solution. XCode tente de convertir en un objet AnyObject avant .data (), donc au lieu de
value.data(using: String.Encoding.utf8)!, withName: key
J'ai fait
[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key
Dans mon cas, ma liste var n'était pas très grosse, donc le codage en dur était une option.