Быстрая загрузка 3-х слотов Alamofire
Благодаря миграции на Swift 3 мне сложно скомпилировать мой проект, который использует Alamofire.
Проблема возникает при загрузке multipartFormData:
Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
multipartFormData in
.
.
.
})
Неоднозначная ссылка на загрузку участника (_: to: method: headers:) '
Любая помощь очень ценится, спасибо заранее!
ПОСТАНОВИЛИ:
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)
}
})
Так как метод загрузки должен быть реализован в Swift 3
Ответы
Ответ 1
Например, используя Alamofire 4.0.0 в Swift 3:
(убедитесь, что вы готовы к работе 4.0.0, поскольку похоже, что вы еще не обновили свой Alamofire)
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, to: URL, encodingCompletion: { (result) in
// code
})
или
Alamofire.upload(multipartFormData: { (multipartFormData) in
// code
}, with: URL, encodingCompletion: { (result) in
// code
})
Итак, headers
необходимо передать по URL-адресу:
let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
Ответ 2
Попробуйте это, и URL-адрес, указанный как @pedrouan, сказал.
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
}, to: url)
{ (result) in
//result
}
Ответ 3
В быстром 3, пытаясь установить multipartFormData как @DCDC, указано в его решении. XCode пытается передать в AnyObject перед .data(), поэтому вместо
value.data(using: String.Encoding.utf8)!, withName: key
Я сделал
[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key
В моем случае мой список var был не большим, поэтому hardcoding был вариантом.
Ответ 4
Для Swift 3 и Alamofire ~ 4.3.0
Если кто-то вроде меня попытался получить объект запроса синхронно (без использования блокировок или dispatch_groups), вы можете использовать этот подход:
// 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
Обратите внимание, что вам нужно установить Content-Type
заголовок из multipartFormData
, поскольку он содержит границы.
Если вам не требуется синхронно иметь объект запроса, другой ответ с
Alamofire.upload(multipartFormData: { (multipartFormData) in
работает как ожидалось. В случае успешного кодирования данных он вернет вам объект запроса при закрытии обратного вызова.
ВАЖНОЕ ПРИМЕЧАНИЕ:, если вы используете метод, который я описал, он заблокирует ваш поток (в большинстве случаев, вы, вероятно, в основном потоке), чтобы скопировать и закодировать свои данные. Поэтому не используйте его для больших файлов или что-то еще. Это асинхронно в Alamofire специально.