AFNetworking: enqueueBatchOfHTTProblemas de ejecución con bloque de finalización

Utilizo este método AFNetworking para iniciar varias requestes a la vez:

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

Una de ellas es 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 queue de envío interna para el procesamiento JSON. Entonces, los datos JSON todavía se están procesando 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 que se haya llamado al bloque de éxito de la operación JSON?

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

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.

Tiene las NSArray *operations disponibles en el bloque de finalización, puede repetir las operaciones y search:

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

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

Puede mover su operación Json al comienzo de la queue y luego agregar una dependencia para que otra operación solo pueda comenzar después de que termine la operación json:

  [lastOperation addDependency:jsonOperation] 

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

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

Entonces, el bloque de éxito de la operación se vería como

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

Se aplicarán advertencias: para las respuestas JSON grandes, esto potencialmente bloquea el código, y algunas de las soluciones de NSJSONSerialization problemas de NSJSONSerialization no se aplicarían. Pero esto te ayudaría.

Actualización: el primer comentarista a continuación sugiere utilizar AFJSONRequestOperation y llamar a responseJSON en él en el bloque de finalizació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 set mixto de llamadas JSON, por lo que el código es más limpio si puedo mantenerlo en un bloque de success directamente asociado con la operación).