#swift #alamofire
#swift #alamofire
Вопрос:
Я работаю с Swift 4 и Alamofire 5, загружаю две многострочные фотографии и хочу распечатать прогресс
AF.upload(
multipartFormData: { MultipartFormData in
MultipartFormData.append(firstPic, withName: "first_pic", fileName: "image.jpeg", mimeType: "image/jpeg")
MultipartFormData.append(secondPic, withName: "second_pic", fileName: "image.jpeg", mimeType: "image/jpeg")
}, to: urlString, encodingCompletion: { encodingResult in
switch encodingResult {
case .Success(let upload, _, _):
upload.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
print(totalBytesRead)
}
upload.responseJSON { request, response, result in
print(result)
}
case .Failure(let encodingError):
print(encodingError)
}
})
и при этом выдается сообщение об ошибке
Метки аргументов ‘(multipartFormData:, to:, encodingCompletion:)’ не соответствуют никаким доступным перегрузкам
библиотека обновила код или что-то еще??
Комментарии:
1.
AF
это хороший ярлык для Alamofire 🙂2. @vpoltave На самом деле это то, что использует Alamofire 5, и да, это хороший AF :»D
Ответ №1:
Пожалуйста, измените в соответствии с вашими потребностями
func upload(image: Data, to url: Alamofire.URLRequestConvertible, params: [String: Any]) {
AF.upload(multipartFormData: { multiPart in
for (key, value) in params {
if let temp = value as? String {
multiPart.append(temp.data(using: .utf8)!, withName: key)
}
if let temp = value as? Int {
multiPart.append("(temp)".data(using: .utf8)!, withName: key)
}
if let temp = value as? NSArray {
temp.forEach({ element in
let keyObj = key "[]"
if let string = element as? String {
multiPart.append(string.data(using: .utf8)!, withName: keyObj)
} else
if let num = element as? Int {
let value = "(num)"
multiPart.append(value.data(using: .utf8)!, withName: keyObj)
}
})
}
}
multiPart.append(image, withName: "file", fileName: "file.png", mimeType: "image/png")
}, with: url)
.uploadProgress(queue: .main, closure: { progress in
//Current upload progress of file
print("Upload Progress: (progress.fractionCompleted)")
})
.responseJSON(completionHandler: { response in
//Do what ever you want to do with response
if let error = response.error {
print(error)
}
guard let data = response.value else {
return
}
print(value)
})
}
Комментарии:
1. Где в этом блок сбоя?
2. спасибо, у меня это работает, но, как сказал @VarunNaharia, где мы можем получить сообщение об ошибке при сбое сетевого вызова?
3. @SohaibSiddique в ответе обработчика компиляции является типом результата, который содержит как значение, так и ошибку. Пожалуйста, ознакомьтесь с обновлением
Ответ №2:
Alamofire 5 больше не требует encodingCompletion
! Вместо этого кодирование формы из нескольких частей выполняется как часть стандартного теперь асинхронного процесса запроса и будет возвращать ошибки в Request
, и они доступны во время вызовов validate
и response*
.
Комментарии:
1. Спасибо, моя дорогая, есть ли простой способ ускорить загрузку в alamofire 5?
2.
uploadProgress
может использоваться как предыдущийprogress
.
Ответ №3:
let headers: HTTPHeaders = [
/* "Authorization": "your_access_token", in case you need authorization header */
"Content-type": "multipart/form-data"
]
AF.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(imageOrVideo!.jpegData(compressionQuality: 0.5)!, withName: "upload_data" , fileName: "file.jpeg", mimeType: "image/jpeg")
},
to: "http://----/new.php", method: .post , headers: headers)
.response { resp in
print(resp)
}