2012-02-08 98 views
2

我正在使用AFNetworking并非常喜欢它。 我需要从我的服务器获取JSON数据,并且没关系,它完美地工作。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]; 

而且我的结果:

得-1的27129字节

获取127481 -1字节

获取的-1个字节176699

因此,我认为AFNetworking下载JSON数据时不能估算出真正的大小,与zip文件或图像相反?

回答

2

从细读源代码看来,进度回调只是通过缓存的内部NSHTTPURLResponse对象的expectedContentLength属性。因此,如果由于某种原因,服务器没有正确发送头文件,并且/或者正在进行分块传输编码,那么该值是未知的,并且返回值NSURLResponseUnknownLength(恰好定义为-1)。

尝试检查由您的应用程序上下文之外的HTTP请求返回的标头。如果您得到一个价值理性的Content-Length标题,则问题可能在于AFNetworking本身。如果不存在,问题在于服务器。我从来没有见过HTTP服务器使用分块传输编码发送JSON响应(大多数情况下,内容大小应该相对较小,并且在发送标头时已知),但是在规范中是这样做的。 OK Warrenm。

+1

OK Warrenm。我打印响应头并且内容长度不存在。你是对的。我在我的服务器上使用Rails 3。我会试着找出为什么它不存在,并可能在Rails或类似的东西中强制它。好吧,我在我的Rails配置中添加了这个:config.middleware.use Rack :: ContentLength。但结果很奇怪:“Content-Length”= 2658; =>获取2658字节的176699。我确定JSON的字节数超过2658 ... – 2012-02-09 07:55:12

+0

听起来像内容长度的不匹配可能与完整的和gzip的大小之间的差异有关。不知道这是否有帮助... – mattt 2012-02-13 05:13:08