NSURLConnection을 비동기적으로 사용하면 데이터가 반환되지 않습니다.
-
16-09-2019 - |
문제
나는 좀 그럴 것 같은 일로 많은 시간을 보내고 있다.
간단하지만 일을 할 수 없는 것 같아요.나는 건물을 짓고 있다
웹 호스트에서 데이터를 검색하는 iPhone 앱입니다.나는 노력하고있다
유지하고 싶기 때문에 호스트에 대한 비동기 연결을 설정합니다.
연결 중에 장치가 해제되었습니다.(sendSynchronousRequest가 정지됨
요청이 완료될 때까지 전화를 받지 않습니다.) 연결 코드는 다음과 같습니다.
//temp url to see if data is returned:
NSURL *theURL = [NSURL URLWithString:@"http://www.theappleblog.com/feed"];
NSURLRequest *dataRequest = [NSURLRequest requestWithURL:theURL
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:60];
/* establish the connection */
theConnection = [[NSURLConnection alloc]
initWithRequest:dataRequest
delegate:self
startImmediately:YES];
if (theConnection == nil) {
NSLog(@"Connection Failure!");
self.urlData = nil;
} else {
self.urlData = [[NSMutableData data] retain];
}
적절한 대리자 메서드를 모두 설정했습니다.
-(void)connection:(NSURLConnection *)connection
didReceiveResponse:(NSURLResponse*)response
{
[urlData setLength:0];
UIApplication *application = [UIApplication sharedApplication];
application.networkActivityIndicatorVisible = YES;
NSLog(@"Received Response!");
}
-(void)connection:(NSURLConnection *)connection
didReceiveData:(NSData*)incrementalData
{
[self.urlData appendData:incrementalData];
NSNumber *resourceLength = [NSNumber
numberWithUnsignedInteger:[self.urlData length]];
NSLog(@"resourceData length: %d", [resourceLength intValue]);
NSLog(@"filesize: %d", self.urlDataSize);
NSLog(@"float filesize: %f", [self.urlDataSize floatValue]);
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
NSLog(@"Connection finished loading\n");
NSLog(@"Succeeded! Received %d bytes of data",[urlData length]);
_isFinished = YES;
UIApplication *application = [UIApplication sharedApplication];
application.networkActivityIndicatorVisible = NO;
}
- (void)connection:(NSURLConnection *)connection
didFailWithError:(NSError *)error
{
NSLog(@"Error: %@",[error localizedDescription]);
}
보시다시피, 저는 제가 원했기 때문에 엄청난 양의 로그 메시지를 받았습니다.
있는지 확인하기 위해 아무것 전혀 통과하고있었습니다.내 연결 테스트
TRUE로 돌아오지만 데이터가 로드되지 않습니다.내가 말했듯이, 난 확신해요
나는 뭔가를 하고 있는 것 같다(또는 하고 있지 않은 것 같다) 정말 멍청한.근데 뭐?
어떤 도움이라도 주시면 감사하겠습니다.
고마워요, 로렌스
해결책
이것은 귀하의 질문에 직접 대답하지는 않지만 Ben Copsey 's를 조사하는 것을 고려할 수 있습니다. ASIHTTPRequest
주위를 감싸는 도서관 CFNetwork
클래스 및이 작업을 제대로 수행하는 데 많은 작업을 수행하는 비동기식 스레드 요청 코드를 포함합니다.
다른 팁
문제는 프로그램 흐름을 계속하고 연결이 다운로드를 완료하도록 멈추지 않았다는 것입니다. 모든 제안에 감사드립니다.
몇 가지 제안 :
첫 번째 스 니펫에서 대신
theConnection
할당 해보세요self.theConnection
속성 액세서 방법이 호출되도록합니다. 여러 곳에서 당신은 또한 교환합니다self.urlData
그리고urlData
. 통과함으로써 그들 모두를 일관성있게 만들고 싶을 수도 있습니다.self
.당신은 만들고 싶을 수도 있습니다
dataRequest
재산도 마찬가지입니다self
그것이 유지되는지 확인합니다.self.urlData = [[NSMutableData data] retain];
- 추가 보유가 필요하지 않아야합니다. 를 통과self
당신을 위해 그것을합니다. 여분의 보유는 모든 것이 완료 되더라도 물체가 튀어 나와 누출되도록합니다.관련 메모에서 NSLOG에서 각 객체에 대한 유지 카운트를 인쇄하십시오. 또한 이러한 구조물 (또는 세트를 출시하기 위해 일반적인 청소 루틴을 원할 수도 있습니다.
self.foo = nil
) 그러므로 어느 시점에서, 그것이 헛소리를 내면 일상을 부르면 물건을 정리할 수 있습니다.Charles 또는 Wireshark 사본 (또는 콘솔에서 tcpdump를 실행)을 받고 네트워크 트래픽을보십시오. 그것은 실패하는 흐름의 어떤 단계에서 어떤 단계를 정확히 지적하는 데 도움이 될 것입니다.
초기 생각 - 이 모든 코드가 포함된 개체가 제대로 유지되고 있습니까?해제되어 연결이 해제될 수도 있습니다.
그렇지 않으면 최소한 응답을 볼 수 있어야 합니다.
분명히 거기에 잘못된 것은 없습니다. 실질적으로 동일하고 잘 작동하는 코드가 있습니다. 내가 보는 유일한 차이점은 다음과 같습니다.
나는 nsurlrequestuseprotocolcachepolicy를 사용하여 nsurlrequestreloadignoringlocacedata를 사용합니다
나는 connection = [[nsurlConnection alloc] initwithRequest : whatequest delegate : self]를 사용합니다. STARTIMMED를 지정하는 대신 : 예 (기본이기 때문에)
대의원 방법의 어떤 경우가 있는지 아는 것이 도움이 될 것입니다. 최소한 ConnectionDidFinishLoading 또는 ConnectionDidFail의 하나 이상이 호출되어야합니다. 그렇지 않다면, 대의원 설정에 문제가있을 수 있습니다. 대의원 사인 서명이 올바른지 확실하고 대의원으로 올바른 항목을 전달한다고 확신합니까?
NSLOG 진술이 실행되는 경우 귀하의 질문에서 명확하지 않기 때문에 아무것도 제로하기가 어렵습니다. 당신이 얻은 결과에 대해 조금 더 명확하게하십시오.
빠른 모습에서 잠재적 인 문제처럼 보이는 유일한 것은 연결을 설정할 때 레이스 조건이 있다는 것입니다. 네트워크가 특히 빠르면 슬림하지만 0이 아닌 확률이 높습니다. 연결을 시작하기 전에 또는 연결을 시작하기 전에 UrlData를 할당하는 것이 좋습니다 : DidReceiverSponse :이를 방지합니다.
그렇다면 문제를 해결하지 못하면 더 많은 정보가 필요합니다.
이 코드는 비동기 방법을 사용하여 잘 작동한다고 말합니까? 해당 URL을 테스트하면 다른 URL로 리디렉션되므로 리디렉션 대의원 메소드를 구현하면 어떻게됩니까? 다른 URL을 시도하면 어떻게됩니까?
앱이 그렇지 않으면 반응이 좋습니까? 런 루프가 실행 중입니까? 요청을 시작한 후 앱은 무엇을합니까? 이벤트 핸들러에서 런 루프로 돌아 갑니까? (그렇지 않다면, 런 루프를 통해 배달되기 때문에 콜백을 얻지 못할 것입니다.)
NSURLConnection은 HTTP뿐만 아니라 모든 유형의 프로토콜과 함께 작동하도록 설계되었습니다. 이것은 연결을 의미합니다 : didfail : Witherror가 연결 오류가 있지만 그렇지 않습니다 규약 오류. 프로토콜 오류를 확인하지 않습니다. DidReceiveresponse :. 속임수는 전달 된 응답 객체가 실제로 nshttpurlresponse 객체라는 것입니다. 응답의 상태 코드를 확인하면 404 또는 Server 500과 같은 HTTP 오류가 발생합니다.