AFNetworking + JSON + 进度下载
Posted
技术标签:
【中文标题】AFNetworking + JSON + 进度下载【英文标题】:AFNetworking + JSON + progress download 【发布时间】:2012-02-08 21:00:23 【问题描述】:我正在使用 AFNetworking 并且非常喜欢它。 我需要从我的服务器获取 JSON 数据,没关系,它运行良好。
我添加了 setDownloadProgressBlock,但我认为它不适用于 JSON 下载:可能无法获得估计的下载字节数。
我的代码:
NSMutableURLRequest *request = [[VinocelaHTTPClient sharedClient] requestWithMethod:@"GET" path:@"ws/webapp/services/pull" parameters:nil];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
];
[operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite)
NSLog(@"Get %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);
];
[operation start];
我的结果:
获取 27129 个 -1 个字节
获取 127481 个 -1 个字节
获取 176699 个 -1 个字节
所以,我认为 AFNetworking 在下载 JSON 数据而不是 zip 文件或图像时无法估计要下载的实际大小?
【问题讨论】:
【参考方案1】:通过阅读源代码,似乎进度回调只是传递了缓存的内部NSHTTPURLResponse
对象的expectedContentLength
属性。因此,如果由于某种原因您的服务器未正确发送 Content-Length
标头,和/或正在执行分块传输编码,则该值是未知的,并且返回值 NSURLResponseUnknownLength
(恰好被定义为 -1 )。
尝试在应用上下文之外检查 HTTP 请求返回的标头。如果您得到一个具有合理值的Content-Length
标头,则问题可能出在AFNetworking 本身。如果不存在,则问题出在服务器上。我从未见过 HTTP 服务器使用分块传输编码发送 JSON 响应(大多数情况下,内容大小应该相对较小,并且在发送标头时已知),但这样做符合规范。
【讨论】:
好的,沃伦。我打印响应标头并且内容长度不存在。你是对的。我在我的服务器上使用 Rails 3。我会尝试找出它不存在的原因,并可能在 Rails 或类似的东西中强制它。好吧,我在我的 Rails 配置中添加了这个:config.middleware.use Rack::ContentLength。但结果很奇怪:“Content-Length” = 2658; => 得到 176699 个 2658 字节。我确定 JSON 的字节数比 2658 多... 听起来内容长度不匹配可能与完整大小和 gzip 大小之间的差异有关。不确定这是否有帮助...以上是关于AFNetworking + JSON + 进度下载的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 3.0 setImageWithURLRequest 下载进度