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 下载进度

AFNetworking 进度方法

无法在 AFNetworking 中获取下载进度

AFNetworking 显示上传进度

AFNetworking 2.0 - 在监控进度的同时批量下载图像

显示使用 AFNetworking 下载图像的进度