I’m using AFNetworking and like it very much.
I need to get JSON data from my server and it’s OK, it works perfectly.
I added the setDownloadProgressBlock but I think it can’t work with JSON download: maybe it’s not possible to get the estimated amount of bytes to download.
My code:
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];
And my result :
Get 27129 of -1 bytes
Get 127481 of -1 bytes
Get 176699 of -1 bytes
So, I think AFNetworking can’t estimate the real size to download when downloading JSON data contrary to a zip file or an image ?
From perusing the source, it seems that the progress callback is just passed the
expectedContentLengthproperty of the cached, internalNSHTTPURLResponseobject. So, if for some reason your server isn’t correctly sending theContent-Lengthheader, and/or is doing chunked transfer encoding, that value is unknown, and the valueNSURLResponseUnknownLengthis returned (which happens to be defined as -1).Try inspecting the headers returned by an HTTP request outside the context of your app. If you get a
Content-Lengthheader with a sane value, the problem likely lies in AFNetworking itself. If it is absent, the problem lies with the server. I’ve never seen an HTTP server send a JSON response using chunked transfer encoding (most of the time the content size should be relatively small and known at the time the headers are sent), but it’s within spec for it to do so.