Progress of a Alamofire request

后端 未结 3 1648
难免孤独
难免孤独 2020-12-11 17:53

Will it be possible to show progress for

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


        
相关标签:
3条回答
  • 2020-12-11 18:26

    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)")
                        }
                }
    
    0 讨论(0)
  • 2020-12-11 18:32

    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.

    0 讨论(0)
  • 2020-12-11 18:41

    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!"
        }
    }
    
    0 讨论(0)
提交回复
热议问题