簡體   English   中英

如何將NSURLConnection與UIProgressView集成?

[英]How to integrate NSURLConnection with UIProgressView?

我正在嘗試將NSURLConnection對象與UIProgressView集成,因此我可以在后台進行文件下載時更新用戶。

我創建了一個單獨的對象來在后台下載文件,我在確定如何使用正確的值更新UIProgressView對象中的progress屬性時遇到了問題。 這可能是非常簡單的事情,但我無法通過谷歌搜索來解決這個問題。

這是我的代碼:

- (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是一個浮點數。 filesize是一個持有很長時間的NSNumber。 最后, resourceLength是一個擁有NSUInteger的NSNumber。

我在這里錯過了什么?

不知道我在這里缺少什么,但你的filesize為-1似乎是你的問題。 API文檔明確指出expectedContentLength可能不可用,並且在這些情況下返回NSURLResponseUnknownLength NSURLResponseUnknownLength定義為:

#define NSURLResponseUnknownLength ((long long)-1)

在這些情況下,您無法獲得准確的進展。 您需要處理此問題並顯示某種不確定的進度表。

我認為你打印出錯誤的文件大小。 如果self.filesize確實是NSNumber ,則使用%@格式打印它,因為它是一個對象,而不是一個基元:

NSLog(@"filesize: %@", self.filesize);

通過使用%d ,您只需打印self.filesize的指針值。 要打印出實際的long long值,請使用%lli%d僅適用於32位值):

NSLog(@"filesize: %lli", [self.filesize longLongValue]);

所以你的self.filesize 實際上是 -1,而且除法是正確的。

在您的代碼中,filesize似乎是一個NSNumber對象(!)。 所以

NSLog(@"filesize: %d", self.filesize);

NSLog(@"content-length: %d bytes", self.filesize);

可能會報告類似該對象的地址(id)(或其他內容)。 這是

filesize: 4687472

你看。 正如其他人所指出的,響應返回的文件大小確實為-1,即

NSURLResponseUnknownLength

即,服務器沒有返回文件大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM