I was trying to use MBProgressHUD with NSURLConnection.
The example in Demo project of MBProgressHUD reports:
- (IBAction)showURL:(id)sender {
NSURL *URL = [NSURL URLWithString:@"https://github.com/matej/MBProgressHUD/zipball/master"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
[connection release];
HUD = [[MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES] retain];
HUD.delegate = self;
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
expectedLength = [response expectedContentLength];
currentLength = 0;
HUD.mode = MBProgressHUDModeDeterminate;
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
currentLength += [data length];
HUD.progress = currentLength / (float)expectedLength;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
HUD.customView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]] autorelease];
HUD.mode = MBProgressHUDModeCustomView;
[HUD hide:YES afterDelay:2];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[HUD hide:YES];
}
Running it, the HUD in determinate mode spins fine.
I tried to implement this, but here
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
currentLength += [data length];
HUD.progress = currentLength / (float)expectedLength;
}
the circle is empty and not filled.
I don't know if it depends on the dimension of the requested url.
I request to download a plist (~80 kb) from my website, but the circle keeps being empty and console reports
<Error>: void CGPathAddArc(CGPath*, const CGAffineTransform*, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, bool): invalid value for start or end angle.
I even tried to do this way:
float progress = 0.0f;
while (progress < 1.0f) {
progress += 0.01f;
HUD.progress = progress;
}
But now the circle is completely full and not doing any animation.
I think it depends on the dimension of the requested url, but i'm not so sure, does anyone know how to fix this?
You should check the value of
[response expectedContentLength]
indidReceiveResponse
.A http server can omit the "Content-Length" header and use "Transfer-Encoding: chunked" instead. In that case the content length is not known a priori and
[response expectedContentLength]
returnsNSURLResponseUnknownLength
(which is-1
)`.I could imagine that setting
HUD.progress
to a negative value causes theCGPathAddArc
console messages.According to the documentation, it can also happen that the accumulated
currentLength
becomes larger than the expected response length, so you should check for that also.I solved the problem this way, switching from
NSURLRequest
toNSMutableURLRequest
and setting the value none to the encoding (previously in gzip)