2011-12-29 2 views
0

나는 목록의 각 날짜에 대해 웹 서버에 날짜 목록을 반복하여 요청하고 있습니다.NSURL 연결 요청 일련 번호 지정 (iOS) - 동기 요청 사용?

후속 요청을 서버에 보내기 전에 각 날짜를 완전히 처리하고 싶습니다. 이를 위해 GCD를 사용하여 직렬 디스패치 큐를 설정했습니다. 날짜 루프를 통과 할 때마다 블록이 대기열에 추가됩니다.

내가 겪고있는 문제는 내 NSURLConnection이 표준 비동기 호출을 사용하여 설정된다는 것입니다. 이로 인해 요청이 후속 요청을 차단하지 않습니다. 따라서 그들은 서로를 압도하고 있습니다.

내 질문 : NSURLConnection (디스패치 대기열 내)을 사용하는 것이 합당한 경우입니까? 아니면 표준 비동기 호출을 사용하여 작동하게하는 다른 방법이 있습니까?

+0

빠른 답변을 위해 (Andrew Madsen 및 Xjones)에게 감사드립니다. 동기식 통화가 나를 위해 작동 할 것 같은데. (나는 그것을 피하고 그것과 함께하는 추가 유지 보수 작업을 피하기를 바랬다.) 콜을 엔드 - 투 - 엔드 체인에 관해서는 가능했지만, 내 상황에서는 그것이 가치가 있는지 확신 할 수 없다. 디스패치 대기열을 관리하는 대신, 대신 대기열을 관리하는 일이 포함됩니다. 나는 동기 호출을 설정하는 것이 더 간단하다고 생각한다. –

답변

2

여러 가지 방법이 있습니다. 어떤 방법을 선택하든 연결을 시작하려면 처리 작업을 완료해야합니다.

  1. 직렬 대기열에 추가하는 각 블록에서 동기 요청을 사용하십시오. 동기화 요청의 제한된 오류 처리로 문제가 해결되는 한 현재 구현에서 가장 빠른 솔루션 일 것입니다.

  2. 직렬 대기열을 사용하지 마십시오. 첫 번째 비동기 연결을 시작하고 응답을 처리하십시오. 처리가 완료되면 다음 비동기 연결을 시작하십시오. 린스하고 반복하십시오.

1

동기식 NSURLConnection API를 사용하는 것이 좋은 아이디어라고 생각합니다. 다른 옵션이 있습니다. 하나는 비동기 NSURLConnection API를 사용하는 NSURLConnection 주변에 래퍼 객체를 작성하여 비동기 API 콜백에서 제공하는 멋진 정보 (다운로드 진행률 포함)를 요청할 때 요청이 발생하는 동안 UI를 쉽게 업데이트 할 수 있지만 필요한 모든 작업을 수행하기위한 자체 동기식 메소드를 제공합니다. 본질적으로, 뭔가 같은 :

@implementation MyURLConnectionWrapper 

- (BOOL)sendRequestWithError:(NSError **)error 
{ 
    error = error ? error : &(NSError *){ nil }; 

    self.finishedLoading = NO; 
    self.connectionError = nil; 
    self.urlConnection = [][NSURLConnection alloc] init...] 

    while (!self.finishedLoading) 
    { 
     [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate distantFuture]]; 
    } 

    if (self.connectionError != nil) 
    { 
     *error = self.connectionError; 
     return NO; 
    } 

    return YES; 
} 

@end 

(이것은 모든 내 머리 위로를 입력하고, 많이 생략되어 있지만, 당신에게 기본 아이디어를 줄 것이다.) 또한 떨어져 불 같이 뭔가를 할 수

모두 직렬 파견 큐의 사용을 삼가고 이전에 완료 대리자 메서드에서 각 요청 :

- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 
{ 
    [self sendNextRequest]; 
} 

어느 쪽이든, 당신은 적절하게 연결 오류를 처리하는 방법에 대해 생각해야합니다. 나는 두 가지 접근법을 다른 장소에서 사용하여 성공을 거두었 다.