NSURLSession, задача загрузки - получить реальные переданные байты
Я получал сообщения об ошибках, что мое приложение iOS не загружало изображения на медленных соединениях. Хотя мой тайм-аут, вероятно, был недостаточно высок, была еще одна проблема.
Я обнаружил, что скорость загрузки быстро достигла 100%, хотя я видел в Чарльзе, что байты все еще передаются. Я использую следующий метод NSURLSession:
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
fromData:(NSData *)bodyData
completionHandler:(void (^)(NSData *data,
NSURLResponse *response,
NSError *error))completionHandler
и реализовать следующий метод делегата для получения событий прогресса:
- (void)URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didSendBodyData:(int64_t)bytesSent
totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
На самом деле я использую AFNetworking 2.5.2, который использует этот метод. Моя теория заключается в том, что этот метод делегата сообщает о байтах, отправленных с телефона, а не о фактических байтах, переданных.
Отправка 300 КБ при очень низком соединении немедленно отправит 5-6 пакетов и сообщит о прогрессе 100%, ожидая их получения.
Можно ли получить события прогресса по фактическому количеству байтов, которые были подтверждены переданными?
1 ответ
Да, это возможно!
[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));
}];