Can't Get Real-time Progress Updates for Video Upload with Moya in Swift

31 Views Asked by At

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?

0

There are 0 best solutions below