2015-01-13 17 views
8

Ho cercato ma non ho trovato una risposta pertinente solo nell'obiettivo C. C'è un modo per trovare l'avanzamento del download di un file in Swift, in modo da mostrarlo per utente? Sono nuovo alla programmazione iOS e ho provato con NSURLSession ma senza successo.Trova lo stato di avanzamento di un file in swift

EDIT: Ho usato questo metodo come visto in this post, ma io non riesco a capire come ottenere lo stato di avanzamento:

func downloadFile(page: NSString){ 
    finished = false 
    var statusCode:Int = 0 
    println("Download starting") 
    let url = NSURL(string: page) 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 

     if error != nil { 
      println("download failed with error \(error?.localizedDescription)") 
     } else { 
      println("Expected Content-Length \(response.expectedContentLength)") 
      self.contentLength = response.expectedContentLength 
      if let httpResponse = response as? NSHTTPURLResponse { 
       println("Status Code of number \(self.countDownload) is \(httpResponse.statusCode)") 
       statusCode = httpResponse.statusCode 
      } 
     } 
    } 
    task.resume() 
} 

Grazie in anticipo

+2

Come hai provato questo con 'NSURLSession' e cosa ha fatto di sbagliato? – Wain

+0

Mostraci cosa hai provato – ColdSteel

risposta

4

si Assumendo stanno scaricando un file, c'è una sottoclasse di NSURLSessionTask per il solo, chiamato NSURLSessionDownloadTask. Di seguito è riportato un estratto dalla documentazione NSURLSession su una funzione specifica:

informa periodicamente il delegato sullo stato di avanzamento del download.

func URLSession(_ session: NSURLSession, 
    downloadTask downloadTask: NSURLSessionDownloadTask, 
    didWriteData bytesWritten: Int64, 
    totalBytesWritten totalBytesWritten: Int64, 
    totalBytesExpectedToWrite totalBytesExpectedToWrite: Int64 
) 

Ad esempio, è possibile uscita i progressi alla console facendo:

println("\(totalBytesWritten)/\(totalBytesExpectedToWrite)") 
+0

Credo che funzioni solo se usi i metodi delegati e non una chiusura. – dar512

+0

@ dar512 È vero. Devo notare che non credo che ci sia un modo per trovare i progressi se stai usando una chiusura. – Jeffrey

11

Lo stato di avanzamento può essere calcolato in

URLSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) 

Questo è un uno dei tre metodi richiesti del protocollo NSURLSessionDownloadDelegate. Nel mio caso il codice del metodo è simile al seguente:

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) { 
    // println("download task did write data") 

    let progress = Float(totalBytesWritten)/Float(totalBytesExpectedToWrite) 

    dispatch_async(dispatch_get_main_queue()) { 
     self.progressDownloadIndicator.progress = progress 
    } 
} 

Ho creato un piccolo progetto, che implementa tre differenti approcci:

  • scaricare in modo sincrono
  • scaricare in modo asincrono
  • scaricare con progresso

Check-out: http://goo.gl/veRkA7

Problemi correlati