2015-05-29 14 views
5

Segnalavo bug che la mia app per iOS non è riuscita a caricare le immagini su connessioni lente. Mentre il mio timeout probabilmente non era abbastanza alto, c'era un altro problema.NSURLSessione, attività di caricamento - Trasferisci i byte effettivi trasferiti

Ho trovato che il progresso del caricamento è andato rapidamente al 100% anche se potevo vedere in Charles che i byte venivano ancora trasferiti. Io uso il seguente metodo di NSURLSession:

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
            fromData:(NSData *)bodyData 
          completionHandler:(void (^)(NSData *data, 
                 NSURLResponse *response, 
                 NSError *error))completionHandler 

e implementare il seguente metodo delegato per ricevere eventi progress:

- (void)URLSession:(NSURLSession *)session 
       task:(NSURLSessionTask *)task 
    didSendBodyData:(int64_t)bytesSent 
    totalBytesSent:(int64_t)totalBytesSent 
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 

In realtà sto usando AFNetworking 2.5.2, che utilizza questo metodo. La mia teoria è che questo metodo delegato riporta i byte inviati dal telefono e NON i byte effettivi trasferiti.

L'invio di 300kb a una connessione molto bassa invierà immediatamente 5-6 pacchetti e segnalerà un avanzamento del 100% in attesa che vengano ricevuti.

È possibile ottenere eventi di avanzamento sul numero effettivo di byte che è stato confermato trasferito?

risposta

1

Sì, questo è possibile!

[operation setUploadProgressBlock:^(NSInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
    float prog = (totalBytesWritten/(totalBytesExpectedToWrite * 1.0f) * 100); 
    [self.progBar setProgress:prog]; 
    NSLog(@"%f%% Uploaded", (totalBytesWritten/(totalBytesExpectedToWrite * 1.0f) * 100)); 

    }]; 
+0

Suppongo che 'operazione' sia un 'AFHTTPRequestOperation'. Ho lo stesso "difetto" dell'approccio di cui sopra usando una sessione, temo. –

+0

Se si sta eseguendo l'operazione di caricamento in modo corretto, non dovrebbe creare alcun problema. Ho caricato 30 immagini utilizzando la stessa operazione anche monitorato il progresso come menzionato nella risposta. Assicurati di utilizzare "multipart". – Vizllx

+0

Hai provato a utilizzare un'applicazione proxy come Charles per limitare la velocità di caricamento ad es. 30 kpbs? Questo è quando il progresso inizia ad agire stranamente come descritto nel problema sopra –

Problemi correlati