NSURLSessionDownloadTask обратный вызов прогресса не гладко?

Я загружаю файл с помощью NSURLSessionDownloadTask на переднем плане, и мне нужно показать текущую скорость загрузки в пользовательском интерфейсе,

но я обнаружил, что метод делегата:URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: нельзя назвать гладко введите описание изображения здесь

так что я могу показать точную текущую скорость загрузки.

Я уверен, что это не вызвано сервером. когда я загружаю тот же файл через ASIHTTPRequest, все в порядке, блок выполнения был вызван гладко.

Кто-нибудь знает, ПОЧЕМУ? Спасибо!

ОБНОВЛЕНИЕ № 0:

Реализация метода делегата:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
    _totalReceived += bytesWritten;
    NSLog(@"receive: %8.2f KB, total receive: %8.2f KB", bytesWritten / 1024.f,  _totalReceived / 1024.f);
    CFTimeInterval now = CFAbsoluteTimeGetCurrent();
    if (_lastDataReceiveAt > 0.f) {
        CFTimeInterval delta = now - _lastDataReceiveAt;
        NSLog(@"downloadtask: %p, speed: %8.2f KB/s; avg: %8.2f KB/s; delta time: %3.2fs",
              downloadTask,
              bytesWritten / 1024 / delta, _totalReceived / 1024 / (now - _beginsAt),
              delta);
    }
    _lastDataReceiveAt = now;

    //NSLog(@"downloading ... %.2f%%", totalBytesWritten * 100.f / totalBytesExpectedToWrite);
}

ОБНОВЛЕНИЕ № 1:

Привет, @Rob, Вот мой код установки сеанса:

- (NSURLSession *)sessionWithIdentifier:(NSString *)identifier {
    if (identifier == nil) {
        NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
        identifier = [NSString stringWithFormat:@"%@:///Downloader#%ld", bundleId, time(NULL)];
    }

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    //config.protocolClasses = @[ASIURLProtocol.class];
    return [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
}

И, задача загрузки инициализировать:

_session = [self sessionWithIdentifier:nil];
NSURL *url = ...;
_task = [_session downloadTaskWithURL:url];
[_task resume];

CFTimeInterval now = CFAbsoluteTimeGetCurrent();
_beginsAt = now;
_lastDataReceiveAt = now;
_totalReceived = 0;

1 ответ

Что вы подразумеваете под гладко здесь? Чтобы они не вызывались через равные промежутки времени? Это ожидается.

Все, что вам нужно сделать, это отслеживать время начала и при обратном вызове рассчитать скорость по истекшему времени и полученным данным.

Если это не проблема, пожалуйста, предоставьте больше кода, возможно, реализацию метода делегата и что производит эти журналы. Возможно также, что Вы хотели бы, чтобы журналы были?

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