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));

     }];
Другие вопросы по тегам