Vineeth Vijayan
Vineeth Vijayan

Reputation: 1329

Progress of a Alamofire request

Will it be possible to show progress for

Alamofire.request(.POST, URL, parameters: parameter, encoding: .JSON)
 .responseJSON { response in
 // Do your stuff
}

I get my images/documents as a base64 string then I convert it as files in mobile

Can I show a progress bar with percentage?

I am using Alamofire, Swift 2

Upvotes: 8

Views: 19229

Answers (3)

Lazy Ninja
Lazy Ninja

Reputation: 22527

Alamofire 4.0 and Swift 4.x

func startDownload(audioUrl:String) -> Void {
    let fileUrl = self.getSaveFileUrl(fileName: audioUrl)
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        return (fileUrl, [.removePreviousFile, .createIntermediateDirectories])
    }

    Alamofire.download(audioUrl, to:destination)
        .downloadProgress { (progress) in
            self.surahNameKana.text = (String)(progress.fractionCompleted)
        }
        .responseData { (data) in
            // at this stage , the downloaded data are already saved in fileUrl
            self.surahNameKana.text = "Completed!"
    }
}

Upvotes: 6

Alessandro Ornano
Alessandro Ornano

Reputation: 35392

To make a download with progress for Swift 2.x users with Alamofire >= 3.0:

let url = "https://httpbin.org/stream/100" // this is for example..
let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)

Alamofire.download(.GET, url, parameters: params, encoding: ParameterEncoding.URL,destination:destination)
                .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
                    // This closure is NOT called on the main queue for performance
                    // reasons. To update your ui, dispatch to the main queue.         
                    dispatch_async(dispatch_get_main_queue()) {
                        // Here you can update your progress object
                        print("Total bytes read on main queue: \(totalBytesRead)")
                        print("Progress on main queue: \(Float(totalBytesRead) / Float(totalBytesExpectedToRead))")
                    }
                }
                .response { request, _, _, error in
                    print("\(request?.URL)")  // original URL request
                    if let error = error {
                        let httpError: NSError = error
                        let statusCode = httpError.code
                    } else { //no errors
                        let filePath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
                        print("File downloaded successfully: \(filePath)")
                    }
            }

Upvotes: 5

cnoon
cnoon

Reputation: 16643

The way you monitor progress in Alamofire is using the progress closure on a Request. More details on usage can be found in the README. While that example in the README demonstrates usage on a download request, it still works on a data request as well.

The one important note is that you do not always get perfect reporting back from the server for a data request. The reason is that the server does not always report an accurate content length before streaming the data. If the content length is unknown, the progress closure will be called, but the totalExpectedBytesToRead will always be -1.

In this situation, you can only report accurate progress if you know the approximate size of the data being downloaded. You could then use your approximate number in conjunction with the totalBytesRead value to compute an estimated download progress value.

Upvotes: 10

Related Questions