NSHTTPURLResponseオブジェクトにkey @ "Content-Length"が設定されていないのはなぜですか?その鍵を持っていないのはいつものことですか?`[[response allHeaderFields] objectForKey:@" Content-Length "]`はnilですか?
私はDropboxのSDKに何かをしようとしていますし、私は
[[response allHeaderFields] objectForKey:@"Content-Length"]
戻りnil
とdownloadProgress
が無限であることを引き起こしていることに気付きました:
NSInteger contentLength = [[[response allHeaderFields] objectForKey:@"Content-Length"] intValue];
downloadProgress = (CGFloat)bytesDownloaded/(CGFloat)contentLength;
は私が作ることができますどのような方法があります応答にはその鍵がありますか?
ところで:@Mitchellが言ったように
:これは私が
(gdb) po [response allHeaderFields]
{
"Cache-Control" = "max-age=0";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Type" = "text/plain; charset=UTF-16LE";
Date = "Wed, 10 Aug 2011 06:21:43 GMT";
Etag = 228n;
Pragma = public;
Server = dbws;
"Transfer-Encoding" = Identity;
}
EDIT(ワーク・arounded)を取得しています応答です。サーバーは常にそのようなキーを返すわけではありません。 (はい、TXTファイルのため、時にはなしpngのための奇妙なDropboxのサーバ、:/)だから、 は、私が変更したファイルのdownloadProgress(作業-arounded)を計算するために、ソース:
//In DBRequest.m
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data {
...
bytesDownloaded += [data length];
//start of modification
//Server might not contain @"Content-Length" key,
//in that case use the downloadedBytes. Is better
//than having an infinite value because it could
//be handled by DBRestClient's delegate. (If not
//it will have the same effect as infinite)
if ([response expectedContentLength] == NSURLResponseUnknownLength) {
downloadProgress = (CGFloat)bytesDownloaded;
}else{
NSInteger contentLength = [[[response allHeaderFields] objectForKey:@"Content-Length"] intValue];
downloadProgress = (CGFloat)bytesDownloaded/(CGFloat)contentLength;
}
//end of modification
if (downloadProgressSelector) {
[target performSelector:downloadProgressSelector withObject:self];
}
}
、以来、あなたはどちらかのプログレスバーを持たない時々Safariでダウンロードや好みのブラウザをリコールする場合は
- (void)restClient:(DBRestClient *)client loadProgress:(CGFloat)progress forFile:(NSString *)destPath {
if (progress > 1) {//Work-around: This means the progress is not a
progress = progress/((CGFloat)(metadataOfTheFile.totalBytes));
}
... update the progress bar here
}
文書から、長さを決定できない場合、NSURLResponseUnknownLengthを返す可能性のあるexpectedContentLengthメソッドがあることがわかります。それを試しましたか? –
NSDictionaryにプリミティブ型を格納することはできないので、NSNumberのポインタ値からNSInteger contentLengthを割り当てているようです。これをNSNumber *に変更してください。 –