Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 929
vinbhai4u Avatar asked Nov 20 '15 13:11

vinbhai4u


People also ask

What is the advantage of Alamofire?

Alamofire makes developing networking layers easier, faster and much cleaner. Another great benefit of using it is that it can be studied and its code is available. This can help programmers because it's a well-written framework.

Is Alamofire an asynchronous?

Networking in Alamofire is done asynchronously. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are very good reasons for doing it this way.


3 Answers

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.

like image 97
cnoon Avatar answered Nov 11 '22 12:11

cnoon


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!"
    }
}
like image 30
Lazy Ninja Avatar answered Nov 11 '22 12:11

Lazy Ninja


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)")
                    }
            }
like image 40
Alessandro Ornano Avatar answered Nov 11 '22 12:11

Alessandro Ornano