2012-10-24 3 views
6

Sono stato googling senza risultato, e spero per il vostro aiuto su questo.totalBytesExpectedToRead in setDownloadProgressBlock rimane -1 fino a quando il download è terminato

Ho provato a scaricare un'immagine utilizzando AFHTTPRequestOperation streaming (impostando outputstream). Scarica il file, nessun problema. Ma la barra di avanzamento non viene visualizzata correttamente, perché totalBytesExpectedToRead restituisce sempre -1 e restituisce il valore corretto solo al termine del download.

È questa la natura dello streaming? Oppure ho fatto qualcosa di sbagliato?

Il mio codice qui sotto.

Grazie in anticipo!

(vuoto) invokeAsynchronousSTREAMING: (NSString *) percorso locationToSave: (NSString *) Parametri locationToSave: (NSDictionary *) paramDict callid: (NSString *) callid {

NSMutableURLRequest *request = [[AFServerAPIClient sharedClient] requestWithMethod:@"GET" 
                       path:path 
                     parameters:paramDict]; 

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

if(locationToSave!=nil) { 
    operation.outputStream = [NSOutputStream outputStreamToFileAtPath:locationToSave append:NO]; 
} 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    //DO SOMETHING 

} 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     //DO SOMETHING 
    } 
]; 

[operation setDownloadProgressBlock:^(NSInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 

    NSLog(@"invokeAsyncronousSTREAMING - Received %lld of %lld bytes", totalBytesRead, totalBytesExpectedToRead); 

    //DO SOMETHING 
}]; 

[operation start]; 

} // fine invokeAsyncStreaming

risposta

9

Il progresso di download può restituire -1 se il server non imposta l'intestazione HTTP Content-Length nella risposta.

In questo caso, si consiglia di utilizzare invece un indicatore di stato indeterminato.

5

Inoltre, secondo this question, se la compressione gzip viene utilizzato durante il trasferimento, totalBytesExpectedToRead restituirà ancora -1 anche se l'intestazione contiene un Content-Length (entrambi i casi essendo abbastanza frequente). Questo perché i contenuti possono essere decompressi solo alla fine del trasferimento, quindi le sue dimensioni non saranno note prima del completamento del trasferimento.