2010-08-24 64 views
3

我正在使用NSURLConnection從Web服務下載壓縮文件。在didReceiveData中,我將數據追加到文件中,並且使用良好的互聯網連接似乎都能正常工作。該文件在下載時透明地解壓縮。 但是,如果我的網絡連接較差,則在收到所有數據之前,會調用connectionDidFinishLoading。是否有另一個委託方法,我應該陷阱或NSURLConnection中的某種超時,使它認爲下載完成,而不是調用didFailWithError?在下載所有文件之前調用NSURLConnection connectionDidFinishLoading

回答

4

您應該檢查收到的數據的大小是否與預期的一樣。

下面將讓你的數據的預期大小:

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
long long dataSize = [response expectedContentLength]; 
} 

每次你得到didReceiveData呼叫時,它會從數據尺寸減少,如果你得到一個電話connectionDidFinishLoading和數據尺寸較大比0還有問題。

+0

感謝,將解決我的問題,但我還是不明白爲什麼NSURLConnection的認爲當有明確的東西錯了,它已經無誤地完成。 – Russ 2010-08-27 18:13:45

+1

Web服務器沒有義務在超時時報告錯誤,因爲在某些情況下,您已獲得的數據可能已足夠,並且如果不是您再次嘗試或從您停止的地方恢復,請立即致電 – 2010-08-27 23:23:44

+0

剛剛被這個愚蠢的錯誤所擊中。爲什麼地獄不是didFailWithError調用?這顯然是一個錯誤! – 2013-10-11 13:48:19

0

我又回到了這個問題上,因爲我也有這個問題,並且花了很多時間去理解錯誤。

顯然,我有更好的結果(在iOS)當我使用 [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE];

我做了接收數據的仔細檢查,然後重新啓動其中,如果沒有接收到所有數據就停止請求,東西像:

- (void)connectionDidFinishLoading:(NSURLConnection *)myConnection{ if (receivedDataSize<expectedDataSize) // protection { [self.connection cancel]; [self setConnection:nil]; [self setResponseData:nil];
self.connection = [NSURLConnection connectionWithRequest:[myConnection originalRequest] delegate:self];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:myConnection.originalRequest.URL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:kRestRequestTimeout]; [request setHTTPMethod:myConnection.originalRequest.HTTPMethod];

// Define the bytes we wish to download. Start from where it's stopped 
    NSString *range = [NSString stringWithFormat:@"bytes=%i-",[[NSNumber numberWithLongLong:receivedDataSize]intValue]]; 
    [request setValue:range forHTTPHeaderField:@"Range"]; 
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE];} 

希望它可以幫助

相關問題