2009-06-30 4 views
7

다음과 같이 NSURLConnection을 사용하여 HTTP를 통해 이미지를 얻고 있습니다. -iPhone - HTTP를 통해 수신 된 이미지의 JPEG 데이터가 손상됨

NSMutableData *receivedData; 

- (void)getImage { 
    self.receivedData = [[NSMutableData alloc] init]; 
    NSURLConnection *theConnection = // create connection 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {  
    [receivedData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [connection release]; 

    UIImage *theImage = [UIImage imageWithData:receivedData]; 
} 

일반적으로 정상적으로 작동하지만 가끔 로그에 기록됩니다. - : JPEG 데이터 손상 : 데이터 세그먼트

의 조기 종료

이 시점에서 이미지가 완전히 렌더링되지 않습니다. 어쩌면 75 %를 보게 될 것이고, 오른쪽 아래 구석은 회색 상자입니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 내 이미지를 부적절하게 만드나요?

+0

많은 이미지를 다운로드했지만 아직 보지 못했습니다. 이미지가 너무 큽니까? 다른 장치 (컴퓨터, 시뮬레이터)에서 이러한 현상이 발생합니까? –

+0

특히 크지는 않습니다. iPhone과 시뮬레이터에서 모두 볼 수 있습니다 (웹 브라우저를 통해 이미지를 치는 것이 아닙니다). – bpapa

+0

인터넷 연결도 확인하십시오. –

답변

9

HTTP 코드가 올바르게 표시됩니다. 받은 데이터의로드가 완료되면 receivedData의 크기를 기록하고이를 서버의 예상 이미지 크기와 비교할 수 있습니다. 예상 된 크기라면 이미지 자체가 서버에서 손상되었을 수 있습니다.

+7

감사합니다. 덕분에 많은 도움이되었습니다. 이렇게함으로써 나는 그것이 내 자신의 프로그래밍 오류임을 깨달았다 (나는 실수로 요청을 두 번 발사했다). – bpapa

+1

나는 bpapa와 같은 일을하고있었습니다. 동일한 URL에 2 개의 다른 NSURLConnections를 시작하면 최종 결과가 손상된 것으로 보입니다. – CornPuff

+1

나는 똑같은 문제를 겪었고 실제로 같은 원인에서 나온 것입니다 : 동일한 이미지에 2 개의 연결. –

1

나는 이것을 또한 보았다. 데이터를 파일에 저장 한 다음 데이터를 이미지로 다시 읽으면 완벽하게 작동합니다. jpeg 이미지 데이터에 http 헤더 정보가있는 것 같습니다.

누군가가 해결책을 찾길 희망합니다. 파일 저장 방법이 좋지 않기 때문입니다.

// problem 

UIImage *newImage = [UIImage imageWithData:receivedData]; 

// crappy workaround 

[receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO]; 
UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];
+0

시도해도 아무 것도 바뀌지 않습니다 – Abramodj

3

ASI-HTTP는이 문제를 해결할 수 있습니다.

NSURL *coverRequestUrl = [NSURL URLWithString:imageStringURL]; 
ASIHTTPRequest *coverRequest = [[ASIHTTPRequest alloc] initWithURL:coverRequestUrl]; 
[coverRequest setDelegate:self]; 
[coverRequest setDidFinishSelector:@selector(imageRecieved:)]; 

[appDelegate.queue addOperation:coverRequest]; 
[appDelegate.queue go]; 

appDelegate의 내 대기열 변수는 ASINetwork 대기열 개체입니다. 비동기 요청을 보내기 때문에 그것을 사용합니다.

- (void)imageRecieved:(ASIHTTPRequest *)response 
{ 
    UIImage *myImage = [UIImage imageWithData:[response responseData]]; 
} 
2

NSMutableDictionary를 사용하여이 문제를 해결했습니다. 제 loadData 함수에서

NSMutableDictionary *dataDictionary; 

, 내 데이터를 정의 키 [theConnection 설명]이며 개체 내 데이터이다
NSMutableData *receivedData = receivedData = [[NSMutableData alloc] init]; 

그럼 내 사전에 데이터를로드.

[dataDictionary setObject:receivedData forKey:[theConnection description]]; 

대표에 그런 식으로, 나는 그렇지 않으면 나는 JPEG munging/손상 문제와 끝까지 대리자에 전달되는 연결에 대한 올바른 데이터 객체를 검색하고 올바른 데이터 인스턴스에 저장할 수 있습니다. didReceiveData에서

, I는 입력 :

//get the object for the connection that has been passed to connectionDidRecieveData and that object will be the data variable for that instance of the connection. 
NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]]; 

//then act on that data 
[theReceivedData appendData:data]; 

마찬가지로 didReceiveResponse에서, I는 입력 :

NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]]; 
[theReceivedData setLength:0]; 

그리고 connectionDidFinishLoading에

: NSMutableData * theReceivedData = 데이터 사전 objectForKey : 연결 설명] ; img = [[UIImage alloc] initWithData : theReceivedData];

그리고 이것은 매우 잘 작동하는 것 같습니다. 그건 그렇고, 내 코드는 Apple's tutorial for NSUrlConnection에 NSMutableDictionary를 추가하여 개별 연결을 추적합니다. 이게 도움이 되길 바란다. 내 전체 이미지 처리 코드를 게시하도록 알려주십시오.

+0

동일한 방법을 사용합니다. 훌륭하게 작동합니다. 요청을 보내기 전에 사전에 데이터 객체를 할당하고 초기화해야합니다. 그렇지 않으면 똑같은 실수로 끝날 것입니다. – JWKothe

0

receivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length]을 사용하여 NSData 내용을 복사하는 것이 도움이 될 수 있으며 디스크에 저장하고 디스크에서 읽는 것보다 효율적입니다.

이유는 원래 receivedData 객체가 콘텐츠 (예 : [NSData dataWithBytesNoCopy:length:]을 사용하여 생성 된 경우)를 유지하지 않고 해제 된 후에 읽으려고한다는 것입니다.

이 문제는 NSData 개체를 만든 스레드의 다른 스레드에서이 문제가 발생할 때 발생할 수 있습니다.

관련 문제