【问题标题】:MBProgressHUD with NSURLConnection带有 NSURLConnection 的 MBProgressHUD
【发布时间】:2012-09-02 11:32:03
【问题描述】:

我试图将 MBProgressHUD 与 NSURLConnection 一起使用。

MBProgressHUD报告Demo项目中的示例:

- (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;
    }

圆圈是空的,没有填充。

我不知道这是否取决于请求的 url 的维度。

我请求从我的网站下载一个 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;
    }

但是现在这个圆圈已经完全填满了,没有做任何动画。

我认为这取决于请求的 url 的尺寸,但我不太确定,有人知道如何解决这个问题吗?

【问题讨论】:

    标签: objective-c nsurlconnection mbprogresshud


    【解决方案1】:

    我通过这种方式解决了这个问题,从NSURLRequest 切换到NSMutableURLRequest 并将值设置为无编码(以前在gzip 中)

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:anURL];
    [request addValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
    

    【讨论】:

    • 这确实可以解决这个问题,但为什么呢?你能解释一下为什么这会导致服务器返回内容长度,否则它不会?
    • NSURLSession 有同样的问题,它返回NSURLSessionTransferSizeUnknown(-1) 的totalexpectedbytes 以响应下载。当服务器返回“gzip”响应并且您的回答使我朝着正确的方向前进时,最有可能发生这种情况。将“Accept-Encoding”设置为空白会告诉服务器客户端尚未准备好接受任何特定格式(如“gzip”)的响应。因此服务器只是绕过“gzip”ping 响应流并返回原始字节。幸运的是NSURLSession(和NSURLconnection)可以得到预期的号码。字节数。
    【解决方案2】:

    您应该检查didReceiveResponse[response expectedContentLength] 的值。

    http 服务器可以省略“Content-Length”标头,而使用“Transfer-Encoding: chunked”。在这种情况下,内容长度是先验未知的,[response expectedContentLength] 返回NSURLResponseUnknownLength(即-1)`。

    我可以想象将HUD.progress 设置为负值会导致CGPathAddArc 控制台消息。

    根据文档,累积的currentLength 也可能会大于预期的响应长度,因此您也应该检查一下。

    【讨论】:

    • 你是对的。值为-1。我能做些什么来解决这个问题吗?
    • @Pheel:在客户端您无能为力。如果服务器使用“Transfer-Encoding: chunked”,那么你只是不知道需要多少字节。
    【解决方案3】:

    在 swift 中,我通过在 url 请求的 Accept-Encoding 标头字段中发送空字符串解决了这个问题。预计写入的总字节数现在返回正在下载的文件的实际大小(以字节为单位)。

    var request = URLRequest(url: url)
    request.addValue("", forHTTPHeaderField: "Accept-Encoding")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多