2012-06-15 14 views
12

Io uso questo metodo AFNetworking per avviare più richieste in una sola volta:AFNetworking: enqueueBatchOfHTTPRequestOperations problema con il blocco di completamento

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

Uno di loro è un AFJSONRequestOperation. Il problema è che il blocco di successo di questa operazione JSON viene eseguito dopo il blocco di completamento del batch. Il motivo è: AFJSONRequestOperation ha una coda di invio interna per l'elaborazione JSON. Quindi i dati JSON sono ancora in elaborazione mentre viene chiamato il blocco di completamento.

Domanda: Come è possibile eseguire codice nel blocco di completamento dopo è stato chiamato il blocco di successo dell'operazione JSON?

Ho provato a inviare un blocco di codice sulla coda principale, ma questo non ha aiutato.

risposta

1

Se è possibile, la soluzione più semplice potrebbe essere semplicemente spostare il codice di elaborazione dal blocco di successo di ciascuna operazione al blocco di completamento dell'intero batch.

avete la NSArray *operations disponibili nel blocco di completamento, è possibile scorrere le operazioni e cercare:

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

Hai anche l'indirizzo URL per ogni operazione disponibili tramite la proprietà operation.request.URL se avete bisogno di preforme diverse azioni

+0

OP ha detto che il json è ancora non elaborato quando viene chiamato il completamento, quindi questo non funzionerebbe, giusto? – kevboh

+0

Sì, è per questo che sto chiedendo. Quindi questa risposta non mi sta aiutando. – Felix

+1

Oh, giusto ho letto male. Per quanto riguarda il tuo problema, potrebbe esserci presto una patch se puoi aspettarla. https://github.com/AFNetworking/AFNetworking/issues/362 –

0

È possibile spostare il funzionamento jSON per l'inizio della coda, e quindi aggiungere una dipendenza in modo che un'altra operazione può iniziare solo dopo l'operazione jSON finiture:

[lastOperation addDependency:jsonOperation] 
+0

Potresti essere più specifico? –

+0

immagino qualcosa del genere: if (previousOperation) {[operation addDependency: previousOperation]; } previousOperation = operation; [operazioni addObject: operazione]; non ha funzionato per me – Sosily

0

Sembra che non ci sia un modo semplice per fare esattamente ciò che l'OP richiede, quindi ecco alcuni facili soluzioni.

Una strategia piuttosto schietta sarebbe quella di utilizzare AFHTTPRequestOperation anziché AFJSONRequestOperation e quindi convertire la risposta utilizzando NSJSONSerialization.

Quindi il blocco successo dell'operazione sarebbe simile si applicherebbe

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

Avvertenze - per le grandi risposte JSON Questo è potenzialmente bloccando il codice, e alcune delle soluzioni AFNetworking a NSJSONSerialization problemi non si applicherebbe. Ma questo ti farebbe andare avanti.

Update: Il primo commentatore di seguito suggerisce di utilizzare AFJSONRequestOperation e chiamando responseJSON su di esso nel blocco di completamento dei lotti. Sto bene con quello se la tua situazione lo consente. Nel mio attuale caso d'uso, il mio codice è in qualche modo complicato (sto usando un insieme misto di chiamate JSON, quindi il codice è più pulito se riesco a tenerlo in un blocco success direttamente associato all'operazione).

+0

Avrebbe più senso usare l'operazione JSON e solo richiamare 'responseJSON' su di esso nel blocco di completamento del batch. Questo metodo restituisce in modo sincrono. Questo fornisce il comportamento che l'OP vuole senza le avvertenze che menzioni. –

+0

Grazie @Aaron. Ho aggiornato la mia risposta. – brainjam

Problemi correlati