ios - que - Carga mĂșltiple de Swift 3 Alamofire
que es alamofire (4)
Gracias a la migración a Swift 3, me resulta difícil compilar mi proyecto que usa Alamofire.
El problema ocurre al cargar multipartFormData:
Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
multipartFormData in
.
.
.
})
Referencia ambigua a la carga del miembro (_: to: method: headers :) ''
Cualquier ayuda muy apreciada, gracias de antemano!
RESUELTO:
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)
}
})
Así es como debería implementarse el método de carga en Swift 3
En swift 3, tratando de establecer multipartFormData como @DCDC señaló en su solución. XCode intenta lanzar a AnyObject antes de .data (), así que en lugar de
value.data(using: String.Encoding.utf8)!, withName: key
yo si
[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key
En mi caso, mi lista var no era grande, por lo que la codificación era una opción.
Para Swift 3 y Alamofire ~ 4.3.0
Si alguien como yo intentó obtener el objeto de solicitud de forma sincrónica (sin usar bloqueos o grupos de despacho), puede utilizar este enfoque:
// 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
Tenga en cuenta que debe configurar el encabezado Content-Type
desde multipartFormData
ya que contiene límites.
Si no necesita tener su objeto de solicitud sincrónicamente, la otra respuesta con
Alamofire.upload(multipartFormData: { (multipartFormData) in
está funcionando como se esperaba En caso de una codificación exitosa de datos, devolverá el objeto de solicitud en el cierre de devolución de llamada.
NOTA IMPORTANTE: si usa el método que describí, bloqueará su hilo (en la mayoría de los casos, probablemente esté en el hilo principal) para copiar y codificar sus datos. Entonces no lo use para archivos grandes o lo que sea. Es asincrónico en Alamofire a propósito.
Por ejemplo, usando Alamofire 4.0.0 en Swift 3 :
(asegúrese de estar 4.0.0 preparado ya que parece que aún no ha actualizado su Alamofire)
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, to: URL, encodingCompletion: { (result) in
// code
})
o
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, with: URL, encodingCompletion: { (result) in
// code
})
Por lo tanto, los headers
deben pasar por solicitud de URL:
let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
Prueba este y url establecidos como dijo @ pedrouan .
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
}, to: url)
{ (result) in
//result
}