2012-06-15 5 views
12

와 enqueueBatchOfHTTPRequestOperations 문제는 내가 한 번에 여러 요청을 시작하려면이 AFNetworking 방법을 사용 : 그들 중AFNetworking : 완료 블록

- (void)enqueueBatchOfHTTPRequestOperations:(NSArray *)operations 
           progressBlock:(void (^)(NSUInteger numberOfCompletedOperations, NSUInteger totalNumberOfOperations))progressBlock 
          completionBlock:(void (^)(NSArray *operations))completionBlock 

하나는 AFJSONRequestOperation이다. 문제는이 JSON 연산의 성공 블록이 배치의 완료 블록 다음에 실행된다는 것입니다. 이유는 다음과 같습니다. AFJSONRequestOperation에는 JSON 처리를위한 내부 디스패치 대기열이 있습니다. 따라서 JSON 데이터는 완료 블록이 호출되는 동안 계속 처리 중입니다.

질문 : 완료 블록에서 코드를 실행할 수있는 방법은 이후 JSON 작업의 성공 블록이 호출 되었습니까?

주 큐에 코드 블록을 보내려고했으나 도움이되지 않았습니다.

답변

1

가능한 경우 가장 간단한 해결책은 처리 코드를 각 작업의 성공 블록에서 전체 배치의 완료 블록으로 옮기는 것입니다. 당신이 프리폼해야하는 경우도 operation.request.URL 속성을 통해 사용할 수있는 각 작업에 대한 URL 주소가

for(AFHTTPRequestOperation *operation in operations){ 
    if(operation.response.statusCode == 200){ 
     //Do something with the response 
    }else{ 
    //Handle the failure 
    } 
} 

:

는 당신을위한이 완료 블록에서 사용할 수 NSArray *operations, 당신이 작업을 반복하고 볼 수 있습니다 다른 작업

+0

OP는 완료가 호출 될 때 json이 아직 처리되지 않았기 때문에 이것이 작동하지 않을 것이라고 말했습니까? – kevboh

+0

그래, 그게 내가 묻는 이유야. 그래서이 대답은 나를 돕는 것이 아닙니다. – Felix

+1

오, 오해. 문제를 기다리는 즉시 패치가있을 수 있습니다. https://github.com/AFNetworking/AFNetworking/issues/362 –

0

당신은 큐의 시작 부분에 JSON 작업을 이동하고 다른 작업에만 JSON 작업 후 시작할 수 있도록 다음 종속성을 추가 할 수는 완료 :

[lastOperation addDependency:jsonOperation] 
+0

더 구체적으로 말씀해 주시겠습니까? –

+0

나는 다음과 같이 추측한다 : if (previousOperation) {[operation addDependency : previousOperation]; } 이전 작업 = 작업; [작업 addObject : 작업]; 그것은 나를 위해 작동하지 않았다 – Sosily

0

정확히 OP 요청을 수행하는 쉬운 방법이 없으므로 여기에 몇 가지 간단한 해결 방법이 있습니다.

다소 모호한 전략은 AFJSONRequestOperation 대신 AFHTTPRequestOperation을 사용하고 NSJSONSerialization을 사용하여 응답을 변환하는 것입니다. 이것은 잠재적으로 코드를 차단하는 큰 JSON 응답을 위해, 그리고 NSJSONSerialization 문제에 AFNetworking의 해결 방법 중 일부는 적용되지 않는다 -

success:^(AFHTTPRequestOperation *operation, id responseObject){ 
       NSError *error ; 
       id json = [NSJSONSerialization JSONObjectWithData:responseObject 
              options:kNilOptions error:&error] ; 
       ... 
      } 

주의 사항이 적용됩니다 같은

그래서 작업의 성공 블록이 보일 것이다. 그러나 이것은 당신을 가게 할 것입니다.

업데이트 : 첫 번째 주석 아래 AFJSONRequestOperation를 사용하여 배치 완료 블록에에 responseJSON를 호출 제안합니다. 네 상황에 따라 좋으면 나도 잘한다. 내 현재의 경우에는 내 코드를 다소 복잡하게 만든다 (나는 JSON 호출의 혼합 된 세트를 사용한다. 따라서 코드는 조작에 직접 연결된 success 블록에 보관할 수있다.)

+0

JSON 작업을 사용하는 것이 더 합리적 일 것이며, 배치 완료 블록에서 JSON 작업을 호출하면됩니다. 이 메서드는 동 기적으로 반환됩니다. 이것은 당신이 언급 한 경고없이 OP가 원하는 행동을 제공합니다. –

+0

감사합니다 @ 애런. 나는 나의 대답을 업데이트했다. – brainjam