I'm using the Moya library to upload videos in my iOS app and am trying to get real-time progress updates. However, I only receive a progress update when the upload completes, at which point the progress value jumps to 1.0, without any intermediate values. Here is the code snippet I'm working with:
func createMoyaProvider<Target: TargetType>(targetType: Target.Type) -> MoyaProvider<Target> {
// let provider = MoyaProvider<Target>(plugins: [NetworkLoggerPlugin(configuration: .init())])
let provider = MoyaProvider<Target>()
provider.session.sessionConfiguration.timeoutIntervalForRequest = 120
return provider
}
let provider = createMoyaProvider(targetType: VideoTarget.self)
var cancellable: Cancellable?
func uploadVideo(listingId: String, asset: PHAsset, fileName: String, progress: @escaping (Double) -> Void, completion: @escaping (Result<Response, MoyaError>) -> Void) {
PHImageManager.default().requestAVAsset(forVideo: asset, options: nil) { (avAsset, _, _) in
guard let urlAsset = avAsset as? AVURLAsset else {
completion(.failure(MoyaError.underlying(NSError(domain: "VideoServiceError", code: -1, userInfo: [NSLocalizedDescriptionKey: "Unable to resolve video."]), nil)))
return
}
do {
let videoData = try Data(contentsOf: urlAsset.url)
self.cancellable = self.provider.request(.uploadVideo(listingId: listingId, videoData: videoData, fileName: fileName), callbackQueue: .main, progress: { (progressResponse) in
print(progressResponse.progress)
progress(progressResponse.progress)
}) { result in
completion(result)
}
} catch {
completion(.failure(MoyaError.underlying(error, nil)))
}
}
}
extension VideoTarget: MTargetType {
var isAuthorization: Bool {
switch self {
default:
return true
}
}
var path: String {
switch self {
case .uploadVideo(let listingId, _, _):
return "\(listingId)/video"
}
}
var method: Moya.Method {
switch self {
case .uploadVideo:
return .post
default:
return .get
}
}
var task: Task {
switch self {
case .uploadVideo(_, let videoData, let fileName):
let videoMultipart = MultipartFormData(provider: .data(videoData), name: "file", fileName: "\(fileName).mp4", mimeType: "video/mp4")
return .uploadMultipart([videoMultipart])
default:
return .requestPlain
}
}
}
Has anyone faced a similar issue or have suggestions on how to receive continuous progress updates during the upload process?