2010-02-15 5 views
24

Desidero visualizzare una barra di avanzamento mentre è in corso un download con NSURLConnection. Mentre ricevo dati dal server, posso aggiornare l'interfaccia utente per ogni pacchetto ricevuto. Ma il problema è: come faccio a capire quanti dati ho già e quanti dati devono essere scaricati? Probabilmente in bytes ... E poi devo fare un po 'di matematica per ottenere la percentuale?Come creare una barra di avanzamento per una connessione NSURLC quando si scarica un file?

risposta

63

Nella tua NSURLConnection delegato, implementare qualcosa di simile per scoprire la lunghezza totale dei contenuti. Il server dispone di sostenere questo, ma è molto probabile che funzionare bene con contenuti statici:

- (void)connection: (NSURLConnection*) connection didReceiveResponse: (NSHTTPURLResponse*) response 
{ 
    statusCode_ = [response statusCode]; 
    if (statusCode_ == 200) { 
     download_.size = [response expectedContentLength]; 
    } 
} 

e quindi aggiornare i progressi in questo modo:

- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data 
{ 
    [data_ appendData: data]; 
    download_.progress = ((float) [data_ length]/(float) download_.size); 
    // Broadcast a notification with the progress change, or call a delegate 
} 

Nel mio caso ho un esempio di download che ha size e progress proprietà. Sono di proprietà di un oggetto globale DownloadManager che si prenderà cura di informare le parti interessate dell'avanzamento del download o delle modifiche dello stato.