NSURLSesión, tarea de carga: obtenga bytes reales transferidos

Estaba recibiendo informes de errores de que mi aplicación iOS no podía cargar imágenes en conexiones lentas. Si bien mi time de espera probablemente no fue lo suficientemente alto, hubo otro problema.

Descubrí que el progreso de la carga se convertía rápidamente al 100%, aunque pude ver en Charles que los bytes todavía se estaban transfiriendo. Utilizo el siguiente método de NSURLSession:

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

e implementar el siguiente método de delegado para recibir events de progreso:

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

De hecho, estoy usando AFNetworking 2.5.2, que utiliza este método. Mi teoría es que este método de delegado informa sobre los bytes enviados desde el teléfono y NO los bytes reales transferidos.

Enviar 300kb a una connection muy baja enviará de inmediato 5-6 packages e informará un progreso del 100% mientras espera que se reciban.

¿Es posible get events de progreso en el número real de bytes que se han confirmado transferidos?

¡Esto es posible!

 [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)); }];