2015-11-20 6 views
5

Sarà possibile per mostrare i progressi perprogresso di una richiesta Alamofire

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

ottengo le mie immagini/documenti come una stringa base64 poi convertirlo come file in Mobile

Posso mostrare un progresso barra con percentuale?

Sto usando Alamofire, Swift 2

risposta

8

Il modo di monitorare i progressi in Alamofire sta usando la chiusura progress su un Request. Maggiori dettagli sull'utilizzo sono disponibili nel README. Mentre quell'esempio nel README dimostra l'utilizzo su una richiesta di download, funziona anche su una richiesta di dati.

L'unica nota importante è che non sempre si ottiene una segnalazione perfetta dal server per una richiesta di dati. Il motivo è che il server non segnala sempre una lunghezza accurata del contenuto prima di trasmettere i dati. Se la lunghezza del contenuto è sconosciuta, verrà richiamata la chiusura dell'avanzamento, ma lo totalExpectedBytesToRead sarà sempre -1.

In questa situazione, è possibile segnalare progressi precisi solo se si conosce la dimensione approssimativa dei dati scaricati. È quindi possibile utilizzare il numero approssimativo insieme al valore totalBytesRead per calcolare un valore di avanzamento stimato del download.

+0

mi pare di capire, non posso mostrare un progresso per il rituale di richiesta? – vinbhai4u

+0

Dipende dal tipo di dati che si sta recuperando. Ad esempio, se scarichi dati di immagini da qualcosa come S3 usando 'request', probabilmente sarai in grado di riportare accuratamente l'avanzamento perché il server ti dirà cosa è' totalExpectedBytes'. Se si sta colpendo un servizio Web JSON che calcola la risposta al volo, potrebbe non calcolare l'entità della risposta prima di inviarla. In tal caso NON saresti in grado di riportare accuratamente i progressi. – cnoon

+0

Sto usando il successivo, credo. Quindi penso sia meglio mostrare un caricatore e poi aspettare fino al completamento della richiesta Grazie per il tuo aiuto @ pomeriggio – vinbhai4u

4

Per fare un download con il progresso per gli utenti 2.x Swift con 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

Ho usato il progresso in allerta e voglio usarlo nel fuoco di alamo, ma non ha funzionato per me, ecco il link di quello https://stackoverflow.com/questions/46070516/progress-view-in-alamo-fire -Will-non-update-quando-il download-file-in-swift-3 –

2

Alamofire 4.0 e 4.x Swift

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!" 
    } 
}