2016-02-25 7 views
10

Ho un problema con AFNetworking in un'estensione di condivisione. Nel didSelectPost, sto chiamando:Not Getting Success/Fail callback per Share Extension tramite AFNetworking

[[AuthClient sharedClient] POST: @"/v1/events" 
    parameters: params success:^(AFHTTPRequestOperation * operation, id responseObject) { 
     [self.extensionContext completeRequestReturningItems: nil completionHandler: nil]; 
    } 
    failure:^(AFHTTPRequestOperation * operation, NSError * error) { 
     NSLog(@"error: %@", error); 
     [self.extensionContext cancelRequestWithError: error]; 
    } 
]; 

[AuthClient sharedClient] utilizza il pattern Singleton per ottenere un'istanza di AFHTTPSessionManager con NSURLSessionConfiguration set con un identificatore di sfondo.

Tuttavia, non viene richiamato né il callback di esito positivo né quello di errore e si blocca all'infinito finché l'estensione non viene interrotta. È interessante notare che la richiesta HTTP finisce bene sul lato server; il completamento non viene mai richiamato.

+0

perché non provi la nuova classe AFN? –

+0

puoi mettere in pausa il debugger e guardare tutti i tuoi stack? vedere se 2 di loro stanno cercando di prendere lo stesso blocco. (o i blocchi di altri) – nielsbot

risposta

4

Immagino che il problema non sia con AFNetworking ma il problema è con quella classe singleton. Non hai specificato l'architettura della tua app, ma suppongo che tu possa chiamare più API in diversi controller di visualizzazione utilizzando lo stesso singleton [AuthClient sharedClient] allo stesso tempo. Quindi, stai ricevendo effettivamente una chiamata success ma non per la chiamata precedente, ma alcuni in altre parti del controller. Ho affrontato il problema esatto nella mia applicazione basata su UITabbarController in cui stavo effettuando chiamate API in viewDidLoad di diversi controller di visualizzazione e il mio tester stava modificando continuamente tutte le schede. Così, ho cercato di ottenere la risposta per il controller della prima vista (1a scheda) e ho usato per ottenere la risposta nel secondo controller della vista (2a scheda), che era sbagliato!

+0

Accetto ... Forse inserire una riga NSLog() nel blocco di successo per verificare che non vengano richiamati. Dal momento che stai usando una variabile di istanza su un singleton, può esserci sempre un solo contesto di estensione, quindi se è possibile che una chiamata possa essere in volo quando un'altra persona viene licenziata; allora ci sarà solo una cosa che riceve le richiamate. – Fiid

+0

La registrazione non ha aiutato, ma il problema era con il singleton. Non entrerò nei dettagli specifici dell'app, ma questo mi ha messo sulla giusta strada – iMack

1

1) tenta di eseguire questa richiesta in Postman, per verificare il modo giusto e parametri, se ok -> 2.

2) Cercare di utilizzare la configurazione di sessione come questo

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

// Initialize Session Manager 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfiguration]; 

a questo punto possiamo presumere che il tuo singletone è stato inizializzato per un'altra richiesta con configurazione diversa.

3) similar problem

4) about AFNetworking background

P.S. Provare a utilizzare semplici asincrono sul thread principale, con ogiva in attesa di risposta

1

Alcune cose mi piacerebbe provare:

  • fare un controllo di integrità con una traccia di rete; e assicurati che i dati che hai stiano raggiungendo il cliente.
  • Impostare un punto di interruzione e cercare eventuali thread o anomalie bloccati (prendere in considerazione la possibilità di interrompere le API di rete Apple, ad esempio CFNetworking o NSURLSession ecc.).
  • Verificare che i blocchi lambda/completamento siano correttamente impostati/conservati dall'oggetto singleton/provare a scrivere una semplice routine di test senza utilizzare il singleton per vedere se fa la differenza (ad esempio istanziando manualmente la classe e utilizzando esso).
  • Non è chiaro dallo snippet se il gestore di completamento "riuscito" stampa un messaggio di debug, prendere in considerazione l'aggiunta di un NSLog anche lì, se non si è già nel gestore.

Speriamo che questo possa farti avvicinare a un'idea di cosa sta causando il problema.

Problemi correlati