3

NSURLConnectionでMBProgressHUDを使用しようとしていました。

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

円は空で、塗りつぶされていません。

リクエストされた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のサイズにもよると思いますが、よくわかりません。これを修正する方法を知っている人はいますか?

4

3 に答える 3

8

私はこの方法で問題を解決し、に切り替えNSURLRequestNSMutableURLRequest値noneをエンコーディングに設定しました(以前はgzipで)

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:anURL];
[request addValue:@"" forHTTPHeaderField:@"Accept-Encoding"];
于 2012-09-26T10:02:29.473 に答える
6

[response expectedContentLength]の値を確認する必要がありますdidReceiveResponse

httpサーバーは、「Content-Length」ヘッダーを省略し、代わりに「Transfer-Encoding:chunked」を使用できます。その場合、コンテンツの長さは事前に不明であり、()`を[response expectedContentLength]返します。NSURLResponseUnknownLength-1

HUD.progress負の値に設定すると、CGPathAddArcコンソールメッセージが表示されることが想像できます。

ドキュメントによると、累積currentLengthが予想される応答長よりも長くなる可能性もあるため、それも確認する必要があります。

于 2012-09-02T14:25:27.060 に答える
0

迅速に、URLリクエストのAccept-Encodingヘッダーフィールドに空の文字列を送信することで、この問題を解決しました。書き込みが予想される合計バイト数は、ダウンロードされるファイルの実際のサイズをバイト単位で返すようになりました。

var request = URLRequest(url: url)
request.addValue("", forHTTPHeaderField: "Accept-Encoding")
于 2020-04-16T00:30:36.210 に答える