2012-12-24 13 views
9

Tutte le connessioni server nel mio app va allo stesso modo:NSURLConnection sendSynchronousRequest/sendAsynchronousRequest non riesce dopo applicazione ucciso da iOS

  • dispatch_async ad un secondo filo.
  • sendSynchronousRequest
  • blocchi fail/success sul thread principale.

  • Quanto segue non è il codice completo, solo il concetto:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
        NSURL *url = [NSURL URLWithString:@"someURL"]; 
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
        NSURLResponse *response = nil; 
        NSError *error; 
        NSData *data = [NSURLConnection sendSynchronousRequest:request 
                  returningResponse:&response 
                     error:&error]; 
        if (error) 
        { 
         dispatch_async(dispatch_get_main_queue(), ^{ _failureBlock(error); }); 
        } 
        else 
        { 
         dispatch_async(dispatch_get_main_queue(), ^{ _successBlock(data); }); 
        }); 
    

Bene l'applicazione funziona benissimo! Posso usarlo per migliaia di connessioni server e funziona sempre quando eseguo un nuovo caricamento dell'app. Il problema inizia quando si verifica quanto segue:

  1. Inviare l'app a BG.
  2. Aspetta un po 'di tempo ...
  3. L'app viene uccisa da iOS.
  4. Aperto di nuovo, l'iOS carica l'intera app da zero. (vedi schermata iniziale seguita dalla prima schermata, non è quello che ho lasciato a BG ..)

In questo scenario ho NSURLConnectionErrors !! Tutti loro! Codice 1003, Codice 1009, Codice 9 ... Basta nominarlo! Ottengo errori per tutte le connessioni del server che inizia quando viene caricata l'app. Qualsiasi altra connessione dopo che funziona bene! incluso l'aggiornamento di quelli che sono falliti!

Sembra quasi di provare a raggiungere il mio server troppo presto o troppo presto, MA Controllo e supera un test di reachabillity prima di iniziare una connessione.

Potrebbe davvero usare qualche aiuto qui. Grazie in anticipo.

AGGIORNAMENTO: Come suggerito di seguito, provato a usare sendAsynchronousRequest - mi ha dato lo stesso identico comportamento. (err: 1001 questa volta).

risposta

4

OK capito! L'appDelegate ha creato il tabBar che ha caricato tutti i viewControllers che hanno inviato alcune connessioni NSURLC ... Quindi per iOS pensavo fosse troppo lungo aspettare le risposte e fallire tutte! (Non so in che modo il primo avvio è ok e solo dopo che l'app non ha ucciso)

In ogni caso, Ho cambiato tutti i carichi del server per eseguire con il selettore con ritardo 0.1. In questo modo l'appDelegate potrebbe finire in esecuzione e tutto è BUONO! :)

+1

L'aggiunta di ritardi è un po 'flakey e un ricorso all'ultimo minuto. Prendi in considerazione l'utilizzo di NSNotifications per dire ad altre parti del tuo codice cosa fare dopo che qualcosa è finito. – BlueFish

3

Si dovrebbe guardare con questo metodo e inviare i dati in modo asincrono

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 

il NSOpertationQueue mainQueue utilizza il mainthread tuttavia che consente di aggiornare UI anche sul thread principale vale a dire un activityindicator per esempio ..

+0

Provalo e aggiorna! (scusa se ci vorrà un po 'di tempo.è difficile da riprodurre, sarà più difficile dire se funziona) 10 volte! –

+0

UPDATE: sendAsynchronousRequest - Non va bene. mi ha dato lo stesso identico comportamento (err: 1001 questa volta). :( –

Problemi correlati