我试图将MBProgressHUD与NSURLConnection一起使用。
MBProgressHUD的演示项目中的示例报告:
- (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];
}
运行它,确定模式下的HUD旋转正常。
我试图实现这个,但是这里
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
currentLength += [data length];
HUD.progress = currentLength / (float)expectedLength;
}
圆圈是空的,没有填充。
我不知道它是否取决于所请求网址的维度。
我要求从我的网站下载一个plist(~80 kb),但该圈子一直是空的并且是控制台报告
<Error>: void CGPathAddArc(CGPath*, const CGAffineTransform*, CGFloat, CGFloat, CGFloat, CGFloat, CGFloat, bool): invalid value for start or end angle.
我甚至试图这样做:
float progress = 0.0f;
while (progress < 1.0f) {
progress += 0.01f;
HUD.progress = progress;
}
但现在圆圈已经完全没有做任何动画。
我认为这取决于所请求网址的维度,但我不太确定,是否有人知道如何解决这个问题?
答案 0 :(得分:6)
您应该检查[response expectedContentLength]
中的didReceiveResponse
值。
http服务器可以省略“Content-Length”标头,而是使用“Transfer-Encoding:chunked”。在这种情况下,内容长度不是先验已知,[response expectedContentLength]
返回NSURLResponseUnknownLength
(-1
)`。
我可以想象将HUD.progress
设置为负值会导致CGPathAddArc
控制台消息。
根据文档,累积的currentLength
也会大于预期的响应长度,因此您也应该检查它。
答案 1 :(得分:6)
我用这种方式解决了问题,从NSURLRequest
切换到NSMutableURLRequest
并将值none设置为编码(以前用gzip)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:anURL];
[request addValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
答案 2 :(得分:0)
我很快通过在url请求的 Accept-Encoding 标头字段中发送空字符串来解决了此问题。现在,预期要写入的总字节数将返回正在下载的文件的实际大小(以字节为单位)。
var request = URLRequest(url: url)
request.addValue("", forHTTPHeaderField: "Accept-Encoding")