0

일부 데이터를 다운로드하려면 ASIHTTPRequest를 사용하고 있습니다.ASIHTTPRequest의 요청 순서

내가하는 방법으로 다음과 같습니다 callThirdRequest 내에서 지금

// Request 1 
request1.tag = 1; 
[request1 setDelegate:self]; 
[request startAsynchronous]; 

// Request 2 
request2.tag = 2; 
[request2 setDelegate:self]; 
[request2 startAsynchronous]; 

// Call third request method 
[self callThirdRequest]; 

, 나는 request2에서 다운로드하고 거기에, 내가 startAsynchronous를 호출하고 일부 데이터를 잡아하고있다. 세 번째 요청을 별도의 메서드에서 호출하는 이유는 두 번 이상 호출되기 때문입니다. 일부 콘솔 출력을 넣은 후 request2이 다운로드되기 전에 callThirdRequest이 호출 된 것으로 보입니다. 따라서 callThirdRequestrequest2에 의해 다운로드 된 일부 데이터를 가져 오려고 시도 할 때 데이터가 없으므로 작동하지 않습니다.

왜 그럴까요? request2 다운로드가 완료된 경우에만 callThirdRequest이 호출되도록하려면 어떻게해야합니까?

감사합니다.

답변

2

요청이 비동기 적으로 실행되면 나머지 코드는 동시에 계속 실행됩니다. 귀하의 처음 두 요청은 정확히 그것을 수행하고 있습니다. 두 가지 옵션이 있습니다.

두 번째 요청을 동 기적으로 실행할 수 있습니다. 두 번째 요청이 완료 될 때까지 앱이 고정 상태로 표시되기 때문에 좋은 방법은 아닙니다. 또한이 방법을 사용하면 세 번째 목록에서 두 번째 요청이 실패하는 경우 도움이되지 않습니다.

더 좋은 아이디어는 델리게이트 콜백 메소드를 사용하는 것입니다. 이것은 두 가지 이유로이 문제를 다루는 더 좋은 방법입니다. 우선, 실패한 요청을 적절하게 처리 할 수 ​​있으며 성공적인 요청을 적절하게 처리 할 수 ​​있습니다. 당신이 잘못된 시간에 잘못된 행동을 발사 결국하지 않도록

// Request 2 
request2.tag = 2; 
[request2 setDelegate:self]; 
[request2 startAsynchronous]; 



- (void)requestFinished:(ASIHTTPRequest *)request{ 
    if(request.tag == 2){ 
    [self callThirdRequest]; 
    } 
} 

것은, 그것은 하나 "초"입니다 수 있도록, 대리인 콜백 요청을 확인해야합니다 : 유는 다음과 같이 원하는 . 이 경우 요청의 "태그"속성을 사용했습니다. 요청을 학급의 자산으로 보유한 경우 해당 요청을 확인할 수도 있습니다.

+0

그건 내가 한 일입니다. 감사! 세 번째 요청은 데이터를 다운로드하기 위해 여러 번 호출됩니다. 결국, 나는 창문을 열고 싶다. 마지막 요청이 언제 호출되었는지 어떻게 알 수 있습니까? – darksky

+0

확실하지는 않습니다. 데이터의 특성에 따라 쉽게 결정할 수 있습니다. 분명히 델리게이트 콜백을 사용하고 '태그'가 3인지 확인할 수 있지만 마지막 호출이 언제인지를 알아야합니다. – Moshe

+0

세 번째 요청을 동기식 호출로 설정하고 다운로드가 끝나면 창을 설정하는 것이 더 좋습니까? 세 번째 요청이 몇 번 실행되기 때문에 이것이 작동하는지 확신 할 수 없습니다. – darksky

1

이는 request2가 비동기로 실행되기 때문입니다. request2의 request-did-finish-delegate-method에서 세 번째 요청을 시작해야합니다!

1

이유는 startAsynchronous입니다. 비동기 호출은 다른 스레드에서 작동합니다. request2에 대한 위임을 설정 한 다음 request2가 완료되면 세 번째 요청을 호출해야합니다.

// Request 2 
    request2.tag = 2; 
    [request2 setDelegate:self]; 
    [request2 startAsynchronous]; 

... 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    [self callThirdRequest]; 
} 
+0

고마워요! 여러 번 호출되는 요청도 있습니다. 마지막 호출에서 창을 설정하고 싶습니다. 요청이 마지막으로 호출 된 시간은 어떻게 결정합니까? – darksky