NSURLSessionDownloadTask进度回调不顺畅?

时间:2017-03-08 15:50:55

标签: ios nsurlsession asihttprequest nsurlsessiondownloadtask

我在前台通过NSURLSessionDownloadTask下载文件,我需要在UI中显示当前的下载速度,

但我发现代理方法:URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:未被顺利调用: enter image description here

所以我可以显示准确的当前下载速度。

我确保这不是由服务器引起的。当我通过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 个答案:

答案 0 :(得分:0)

这里你的意思是什么?它们不是以相等的时间间隔调用的吗?这是预期的。

您需要做的就是跟踪开始时间,并在回叫中根据已用时间和收到的数据计算速度。

如果这不是问题,请提供更多代码,可能是委托方法实现以及生成这些日志的内容。也许你想要的日志是什么?