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 ответ
Что вы подразумеваете под гладко здесь? Чтобы они не вызывались через равные промежутки времени? Это ожидается.
Все, что вам нужно сделать, это отслеживать время начала и при обратном вызове рассчитать скорость по истекшему времени и полученным данным.
Если это не проблема, пожалуйста, предоставьте больше кода, возможно, реализацию метода делегата и что производит эти журналы. Возможно также, что Вы хотели бы, чтобы журналы были?