0

을 반환하기 전에 데이터를 반환 :나는 다음과 같은 코드를 사용하여 웹 사이트에 비동기 요청을 보낼 수있는 값

NSMutableURLRequest *requestSiteToSendData = [NSMutableURLRequest requestWithURL:[[NSURL alloc]initWithString:@"www.example.com"] cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30]; 
NSURLConnection *connectionToSiteToSendData = [[NSURLConnection alloc]initWithRequest:requestSiteToSendData delegate:self]; 

은 그 때 나는 얻을 후 데이터를 분석 할 NSURLConnectionDelegate 내부에 정의 된 다음과 같은 방법을 사용 데이터 불러 오기가 완료됩니다.

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    //parse 'data' 
    NSString *parsedData = [self parseDataWithData:data]; 
} 

그런 다음 비동기 요청을 보내는 방법에서는 parsedData을 반환합니다. 그러나 반환은 데이터 가져 오기가 완료되고 파싱이 완료된 후에 발생해야합니다. 내가 동기식 요청을 사용하지 않는 이유가 무엇인지 궁금한 점이 있다면 알아 두십시오. 로딩이 백그라운드에서 진행될 때 다른 메소드를 끊지 않기 때문입니다.

답변

1

빠른 답변 : 비동기식 인 경우 비동기식 메서드를 기다리는 것을 원하지 않습니다. bests의 하나의 옵션은 다음과 같습니다

  • 비동기 메소드를 실행하고, didReceiveData에서 개체로 자신을 설정해야 데이터를 원하는 객체 호출, 당신은 새로를 처리하는 방법 등 updateData:(NSString *)parsedData를 호출 받은 데이터

  • 메서드를 호출하는 개체는 KVO를 사용하여 비동기 메서드를 실행하는 개체의 속성 변경을 관찰해야합니다.

자세한 정보가 필요한 경우 알려주십시오.

+0

실제 문제는 로딩이 완료되고 다른 모든 메소드가 매달리지 않고 그대로 작동해야만 값이 반환되어야한다는 것입니다. 하지만 내 경우에는로드가 완료되기 전에 반환이 호출됩니다. 나는 분명하다. 질문에 대해 얻지 못한 것이 있는지 물어보십시오. –

+1

네, 무슨 뜻입니까, 그리고 그것은 정상입니다 : 요청이 비동기 적으로 이루어지기 때문에 비동기 호출이 완료되면 나머지 기능이 계속됩니다. 나는 당신이 실제로 끝날 때까지 당신의 방법을 기다리고 싶지만 좋은 생각이나 연습은 아니라는 것을 알고 있습니다. 서버가 응답하지 않을 수도 있고 앱이 응답하지 않을 수도 있습니다. 자신이 만든 대표 또는 KVO를 사용하여이 문제를 처리해야합니다. 도움이 필요하면 도와 드리겠습니다. Armaan Stranger의 답변을 사용하여 기다릴 수는 있지만 그렇게하지 않을 것입니다. (응답이없는 앱 등). – DCMaxxx

+0

좋아 .. 문제는 자체 제작 된 대리인을 사용하여 해결되었습니다. 고맙습니다. –

0

비동기 요청이 별도의 스레드에서 실행되므로보기 잠금을 처리 할 필요가 없습니다. 동기식 요청을 보내려면 GCD를 사용해야합니다. 그리고 여러 가지 다른 세부 사항, 즉 얼마나 많은 데이터가 송수신되는지는 동기식 요청에서 사용할 수 없습니다.

동기 요청은 코드의 다음 상태가 요청에 대한 응답으로 수신 된 데이터에 의존하는 경우 유용합니다.

+0

실제 문제는 값이로드가 완료된 후에 만 ​​반환되어야하며 다른 모든 메서드는 매달리지 않고 그대로 작동해야한다는 것입니다. 하지만 내 경우에는로드가 완료되기 전에 반환이 호출됩니다. 나는 분명하다. 질문에 대해 얻지 못한 것이 있는지 물어보십시오. –

+0

그런 다음'[NSThread]'를 사용하여 비동기 요청 대신 동기식을 생성하십시오. 그리고로드가 완료되면 이것을 호출하십시오. 이렇게하면 앱이 멈추지 않습니다. – Ashwani

0

당신은 모든 다운로드가 그쪽으로 서버 successfully.Use에서 모든 데이터를 받았다 때 실행됩니다 나머지 과정을

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // do something with the data 
    // receivedData is declared as a method instance elsewhere 
    NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]); 
} 

확인이 방법을 수행하는이 방법을 완료 때 실행할이 위양 방법이있다. 당신이해야 할 일은 -didReceiveData 대리자 메서드에서 모든 데이터를 수집하고이 메서드에서 구문 분석하는 데 사용하는 것입니다.

A must read document for you

+0

이 작업을 시도했지만 데이터가로드되기 전에 반환됩니다. 데이터를 가져올 때까지 재귀 호출을 시도했지만 응용 프로그램이 중단되고 아무 일도 일어나지 않았습니다. 실제 문제는로드가 완료된 후에 값을 반환해야하며 다른 모든 메서드는 매달리지 않고 그대로 작동해야합니다. 나는 분명하다. 질문에 대해 얻지 못한 것이 있는지 물어보십시오. –

+0

편집 내용을보고 더 명확하게하기 위해 링크를 살펴보십시오 –

0

는 지금까지 내가 이해 당신은 웹 호출이 완료된 후 그 데이터를 반환합니다.

NSHTTPURLResponse* urlResponse = nil; 
NSError *error = [[NSError alloc] init]; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error]; 

if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) { 
     // return responseData from here. 
} 
else { 
     NSLog(@"%d",[urlResponse statusCode]); 
     NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
     NSLog(@"%@",result); 

} 

을 당신은에 당신의보기를 끊었 싶지 않은 : 그래서 나는 이런 식으로 뭔가를있는 NSData를 반환 webcall에 대한 방법을 만들고 수행 건의 할 것입니다. 백그라운드 스레드에서이 메서드를 호출하십시오. 좋아요 :

[self performSelectorInBackground:@selector(WebCallMethod) withObject:nil]; 

희망 하시겠습니까 !!

+0

기본 원리는 백그라운드에서 실행되는 동기 요청이 비동기 요청과 동일한 효과를 나타낼 것이라는 것입니다. 그렇다고해도 요청이 백그라운드로로드 되더라도 여전히 데이터가 반환됩니다. –

+0

@ 하리 크리슈 난. 네 말이 맞아. 그러나 나는 또 다른 선택권을 주었다. 둘 다 똑같이 작동합니다. 그래서 그것은 그를위한 선택 일뿐입니다. –