NSURLConnection オブジェクトを UIProgressView と統合しようとしているので、バックグラウンドでファイルのダウンロードが行われている間にユーザーを更新できます。
バックグラウンドでファイルをダウンロードするために別のオブジェクトを作成しましたが、UIProgressView オブジェクトの進行状況プロパティを正しい値で更新する方法を理解するのに問題があります。おそらく非常に単純なことですが、グーグルで調べてもわかりません。
私が持っているコードは次のとおりです。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[self.resourceData setLength:0];
self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]];
NSLog(@"content-length: %d bytes", self.filesize);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.resourceData appendData:data];
NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]];
NSLog(@"resourceData length: %d", [resourceLength intValue]);
NSLog(@"filesize: %d", self.filesize);
NSLog(@"float filesize: %f", [self.filesize floatValue]);
progressView.progress = [resourceLength floatValue] / [self.filesize floatValue];
NSLog(@"progress: %f", [resourceLength floatValue] / [self.filesize floatValue]);
}
ご覧のとおり、resourceDataメンバー変数は、ダウンロード中のファイル データを保持します。filesizeメンバー変数は、Web サービスによって Content-Length ヘッダーに返される、ファイルのフル サイズを保持します。
すべて問題なく動作します。didReceiveDataを複数回実行してダウンロードしたデータを取得し続けますが、進行状況の値を計算しようとすると、適切な値が返されません。コンソール ログに記録される内容の小さなサンプルについては、以下を参照してください。
content-length: 4687472 bytes
resourceData length: 2904616
filesize: 4687472
float filesize: -1.000000
progress: -2904616.000000
参考までに、progressView.progressは float です。filesizeは long long を保持する NSNumber です。最後に、resourceLengthは NSUInteger を保持する NSNumber です。
ここで何が欠けていますか?