2012-12-24 7 views
9

Alle Server-Verbindungen in meiner app die gleiche Art und Weise geht:NSURLConnection sendSynchronousRequest/sendAsynchronousRequest versagt, nachdem sie von iOS getötet App

  • dispatch_async zu einem zweiten Faden.
  • sendSynchronousRequest
  • Fehler/Erfolg blockiert auf Haupt-Thread.

  • Das folgende ist nicht der vollständige Code, nur das Konzept:

    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); }); 
        }); 
    

Nun, die App funktioniert super! Ich kann es für Tausende von Serververbindungen verwenden, und es funktioniert immer, wenn ich eine neue Ladung der App ausführen. Das Problem tritt auf, wenn Folgendes eintritt:

  1. Senden Sie die App an BG.
  2. Warte einige Zeit ...
  3. Die App wird von iOS getötet.
  4. Erneut öffnen, lädt das iOS die gesamte App von Grund auf neu. (siehe Splash-Screen von dem ersten Bildschirm gefolgt, nicht die, die ich zu BG links ..)

In diesem Szenario I NSURLConnectionErrors bekommen !! Alle Arten von ihnen! Code 1003, Code 1009, Code 9 ... Nenne es einfach! Ich bekomme Fehler für alle Server-Verbindungen, die direkt beim Laden der App startet. Alle anderen Verbindungen danach funktioniert gut! einschließlich der Aktualisierung von denen, die fehlgeschlagen sind!

Es fühlt sich fast an, als würde ich versuchen, meinen Server zu schnell oder zu früh zu erreichen, ABER Ich überprüfe und überreiche einen Erreichbarkeitstest, bevor ich eine Verbindung einleite.

Konnte wirklich etwas Hilfe hier verwenden. Vielen Dank im Voraus.

UPDATE: Wie unten vorgeschlagen, versucht, sendAsynchronousRequest zu verwenden - gab mir das exakt gleiche Verhalten. (err: 1001 diesmal).

Antwort

4
aktualisieren

OK, hab es! Die AppDelegate hat die TabBar erstellt, die alle ViewControllers geladen hat, die einige NSURLConnections gesendet haben ... Also für das iOS dachte es ist zu lang, um auf die Antworten zu warten und sie alle zu scheitern! (Keine Ahnung, wie der erste Start ist in Ordnung und erst nachdem die App nicht getötet)

Wie auch immer, Ich änderte alle Serverlasten mit Selektor mit 0,1 Verzögerung durchzuführen. So könnte das AppDelegate zum Laufen kommen und alles ist GUT! :)

+1

Hinzufügen von Verzögerungen ist ein bisschen flakig und ein Last-Minute-Resort. Überlegen Sie mit NSNotifications anderen Teilen Ihres Codes zu sagen, was zu tun ist, nachdem etwas fertig ist. – BlueFish

3

Sie bei Verwendung dieser Methode aussehen sollte und Asynchron die Daten senden jedoch

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

die NSOpertationQueue mainQueue verwendet der Mainthread so dass Sie UI auch auf dem Haupt-Thread also einen activityindicator zum Beispiel ..

+0

Werde es versuchen und aktualisieren! (Entschuldigung wenn es etwas dauern wird.es ist schwer zu reprozieren, wird schwieriger zu sagen, wenn es funktioniert) 10x! –

+0

UPDATE: sendAsynchronousRequest - Nicht gut. gab mir das exakt gleiche Verhalten (err: 1001 diesmal). :( –

Verwandte Themen