문제

나는 좀 그럴 것 같은 일로 많은 시간을 보내고 있다.
간단하지만 일을 할 수 없는 것 같아요.나는 건물을 짓고 있다
웹 호스트에서 데이터를 검색하는 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 오류가 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top