问题描述:在使用 Alamofire 5.4 进行上传操作时,无法获取上传进度。 问题原因:Alamofire 5.4 的上传操作使用了底层的 Combine 框架,与之前版本有所不同,导致获取进度的方式也发生了改变。 解决方案:通过使用 Combine 框架提供的上传进度监控方法,可以获取上传进度。以下给出代码示例:
import Alamofire
import Combine
enum UploadProgress {
case progress(Double)
}
extension SessionManager {
func uploadWithProgress(
_ data: Data,
to url: URL,
withName name: String,
fileName: String,
mimeType: String
) -> AnyPublisher {
return Future { promise in
self.upload(
multipartFormData: { multipartFormData in
multipartFormData.append(data, withName: name, fileName: fileName, mimeType: mimeType)
},
to: url,
uploadProgress: { progress in
promise(.success(.progress(progress.fractionCompleted)))
}
) { result in
switch result {
case .success(let response):
guard let data = response.data else {
promise(.failure(AFError.responseValidationFailed(reason: .dataFileNil)))
return
}
promise(.success(.progress(1)))
case .failure(let error):
promise(.failure(error))
}
}
}.eraseToAnyPublisher()
}
}
由上述代码可以看出,我们通过对 SessionManager 进行扩展,添加了一个上传方法 uploadWithProgress ,该方法返回一个 AnyPublisher 类型的数据流,通过 Future 类型构建,可以持续发送 UploadProgress 类型的上传进度信息,具体细节可参见代码中的注释。
上一篇:Alamofire/RxSwift如何在状态码为401时自动刷新令牌并重试请求?
下一篇:Alamofire5.XTypeofExpressionisAmbiguousWithoutMoreContext