2010-08-24 3 views
3

웹 서비스에서 압축 파일을 다운로드 할 때 NSURLConnection을 사용하고 있습니다. didReceiveData에서 파일에 데이터를 추가하고 좋은 인터넷 연결을 사용하면 모두 제대로 작동하는 것처럼 보입니다. 파일은 다운로드 될 때 투명하게 압축 해제됩니다. 그러나 인터넷 연결 상태가 좋지 않으면 모든 데이터를 받기 전에 connectionDidFinishLoading이 호출 된 것 같습니다. NSURLConnection에서 트랩이나 다른 종류의 시간 초과가 발생하여 다운로드가 didFailWithError를 호출하는 것과 반대로 완료되었다고 생각하는 다른 대리자 메서드가 있습니까?모든 파일을 다운로드하기 전에 NSURLConnection connectionDidFinishLoading이 호출되었습니다.

답변

4

수신 된 데이터의 크기가 예상과 같은지 확인해야합니다.

다음 당신에게 데이터의 예상 크기 얻을 것이다 :

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

당신이 didReceiveData로 전화를받을 때마다의 dataSize에서 그것을 감소를, 그리고 당신이 connectionDidFinishLoading에 전화를 얻을 경우 dataSize가 더 크다 0보다 큰 경우 문제가 발생합니다.

+0

내 문제를 해결할 것입니다 고맙지 만 명확하게 뭔가 잘못되었을 때 NSURLConnection이 오류없이 완료했다고 생각하는 이유를 여전히 이해할 수 없습니다. – Russ

+1

웹 서버는 이미 가지고있는 데이터로 충분하지 않을 수도 있고 다시 시도하지 않거나 중지 한 곳에서 다시 시작하기 때문에 시간 초과시 오류를보고 할 의무가 없습니다. –

+0

그냥이 바보 같은 버그에 부딪혔습니다. 도대체 왜 FailWithError가 불렀지? 그것은 분명히 오류입니다 !! –

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

희망이 도움이 될 것입니다

관련 문제