2012-06-15 8 views
12

utilizo este método AFNetworking para comenzar a múltiples peticiones a la vez:AFNetworking: enqueueBatchOfHTTPRequestOperations problema con el bloque de terminación

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

Uno de ellos es un AFJSONRequestOperation. El problema es que el bloque de éxito de esta operación JSON se ejecuta después del bloque de finalización del lote. El motivo es: AFJSONRequestOperation tiene una cola de despacho interna para el procesamiento JSON. Entonces, los datos JSON aún están en proceso mientras se llama al bloque de finalización.

Pregunta: ¿Cómo se puede ejecutar el código en el bloque de finalización después de se ha llamado al bloque de éxito de la operación JSON?

Traté de enviar un bloque de código en la cola principal pero eso no ayudó.

Respuesta

1

Si es posible, la solución más simple podría ser simplemente mover su código de procesamiento del bloque de éxito de cada operación al bloque de finalización de todo el lote.

Usted tiene el NSArray *operations disponible en el bloque de terminación, que se pueden repetir las operaciones y buscar:

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

Usted también tiene la dirección URL para cada operación disponible a través de la propiedad operation.request.URL si necesita preformas diferentes acciones

+0

OP dice que el json aún no está procesado cuando se realiza la finalización, por lo que esto no funcionaría, ¿verdad? – kevboh

+0

Sí, es por eso que estoy preguntando. Entonces esta respuesta no me está ayudando. – Felix

+1

Oh, cierto que leí mal. En cuanto a su problema, es posible que haya un parche pronto si puede esperarlo. https://github.com/AFNetworking/AFNetworking/issues/362 –

0

puede mover su operación JSON para el comienzo de la cola, y luego agregar una dependencia para que otra operación sólo puede comenzar después de la operación JSON acabados:

[lastOperation addDependency:jsonOperation] 
+0

¿Podría ser más específico? –

+0

Supongo algo como esto: if (previousOperation) {[operation addDependency: previousOperation]; } previousOperation = operación; [operaciones addObject: operación]; no funcionó para mí – Sosily

0

Parece que no hay una manera fácil de hacer exactamente lo que las solicitudes de OP, así que aquí hay algunas soluciones fáciles.

Una estrategia bastante contundente sería usar AFHTTPRequestOperation en lugar de AFJSONRequestOperation y luego convertir la respuesta usando NSJSONSerialization.

lo tanto, el bloque de éxito de la operación se vería como se aplicaría

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

Advertencias - para grandes respuestas JSON está bloqueando este código potencialmente, y algunas de las soluciones a AFNetworking NSJSONSerialization cuestiones no se aplicaría. Pero esto te ayudaría.

Actualización: El primer comentarista continuación sugiere el uso de AFJSONRequestOperation y llamando responseJSON en él en el bloque de terminación por lotes. Estoy bien con eso si tu situación lo permite. En mi caso de uso actual, complica un poco mi código (estoy usando un conjunto mixto de llamadas JSON, por lo que el código es más limpio si puedo guardarlo en un bloque success directamente asociado con la operación).

+0

Tendría más sentido usar la operación JSON, y simplemente llamar a 'responseJSON' en el bloque de finalización de lotes. Este método regresa sincrónicamente. Esto proporciona el comportamiento que OP desea sin las advertencias que menciona. –

+0

Gracias @ Aaron. Actualicé mi respuesta. – brainjam

Cuestiones relacionadas