2011-03-25 2 views
2

http 서버에 대한 쿼리를 비동기 적으로 실행하고 응답을 처리해야합니다. 쿼리는 실제로 콜백이있는 메서드 호출 꽤 큰 체인입니다. 이것은 일련의 호출 중에 리턴 경로가 많기 때문에 복잡성이 추가됩니다.백그라운드 요청을 안정적으로 관리하는 방법은 무엇입니까?

현재 요청이 완전히 완료 될 때까지 새 요청을 시작해서는 안됩니다.

  1. 일부 스레드가 [Foo poll]를 호출

    다음은 일반적인 개요입니다.

  2. poll 메서드는 백그라운드에서 실행되는 몇 가지 HTTP 요청을 시작합니다. 이 경우 ASIHTTPRequest.
  3. 요청은 결국 응답을 구문 분석하는 [Foo onRequestComplete]을 호출합니다. On error [Foo onRequestError]가 호출됩니다. 이것은 두 번째 반환 경로입니다.
  4. 그러면 더 많은 콜백이 콜백과 더 많은 리턴 경로로 서버에 수행됩니다.
  5. 결국 몇 가지 물건을 디스크에 저장합니다.
  6. 여론 조사는

여기에 완료 캐치이다 :이 단계 동안, poll에 (반환) 무시 또는 설문 조사가 완료 될 때까지 차단해야 호출합니다.

다른 폴링이 실행되는 동안 poll 기능 블록 또는 no-ops를 어떻게 확인할 수 있습니까?

+2

한 매우 순진한 접근 방식은'Server.isBusy' 속성을 추가하는 것입니다,하지만 안전 및 유지 보수가 매우 지저분 스레드되지 않으며, 오류 처리 경로 등 고려 GCD, 블록 또는 동기화 된 무엇입니까? –

+0

잠금 또는 GCD - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – Joe

답변

2

NSLock을 사용하면됩니다. [Foo poll]에서

:

if ([lock tryLock]) { 
    // Do your stuff 
} 

[Foo onRequestComplete]에서 :

[lock unlock]; 
+0

유지하기가 좀 지저분 해. 당신은 장소 (모든 가능한 리턴 경로, 콜백 등)에'lock' 및'unlock' 호출을 추가해야합니다. 나는 GCD를 사용하여 이것에 대한 좀 더 간소화 된 접근이 있어야한다는 짜증나는 느낌이 들지만, 나는 그것을 볼 수 없다. 실망. –

+0

@ Martin Wickman : 질문을 공식화하는 방식으로, 엔트리 포인트 하나와 콜백 하나가있는 것처럼 보입니다. 요청이 실패 할 때 콜백이있을 수 있지만 잠금을 염두에 두어야하는 위치는 여전히 세 곳입니다. 이 잠금 솔루션을 지키기에 충분한 반환 경로가 있다면 어쩌면 잠금의 문제가 아닌 반환 경로의 수일까요? –

+0

이것은 (http, 구문 분석, http, http, ..., 디스크에 저장, 완료) 시퀀스로 구성된 트랜잭션의 양입니다. 잠금을위한 엔트리 포인트가 하나 있지만 각 단계마다 고유 한 콜백이 있으므로 어딘가에서 '잠금 해제'를 놓치기 쉽습니다. 하지만 다른 방법이 없으면 이것이 답이라고 생각합니다. –

관련 문제