我在前台通过NSURLSessionDownloadTask下载文件,我需要在UI中显示当前的下载速度,
但我发现代理方法:URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
未被顺利调用:
所以我可以显示准确的当前下载速度。
我确保这不是由服务器引起的。当我通过ASIHTTPRequest下载相同的文件时,它没问题,进度块被顺利调用。
任何人都知道为什么?谢谢!
委托方法的实施:
- (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);
}
嗨,@ 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;
答案 0 :(得分:0)
这里你的意思是什么?它们不是以相等的时间间隔调用的吗?这是预期的。
您需要做的就是跟踪开始时间,并在回叫中根据已用时间和收到的数据计算速度。
如果这不是问题,请提供更多代码,可能是委托方法实现以及生成这些日志的内容。也许你想要的日志是什么?