2014-03-24 9 views
7

Ich habe in letzter Zeit Objective C gelernt, und ich beschloss, Verbindungen zu versuchen.NSURLSessionDataTask dataTaskWithURL Vervollständigungshandler wird nicht aufgerufen

Alles war großartig mit NSURLConnection, bis ich entdeckte, dass es veraltet war, und versuchte, mit NSURLSession zu arbeiten.

Ich versuche ein sehr einfaches Beispiel, aber ich kann nicht scheinen, meine App zu bekommen, den Code innerhalb des Abschlussblocks auszuführen. Hier

ist der Code verwendet:

NSURL * url = [NSURL URLWithString:@"http://api.openweathermap.org/data/2.5/weather?q=London,uk"]; 

NSLog(@"2"); 
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; 
NSLog(@"3"); 

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject 
                  delegate: nil 
                 delegateQueue: [NSOperationQueue mainQueue]]; 

NSLog(@"4"); 
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url 
               completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                dispatch_sync(dispatch_get_main_queue(), ^{ 
                 NSLog(@"11"); 
                 if(error == nil) 
                 { 
                  NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                  NSLog(@"Data = %@",text); 
                 } 
                 NSLog(@"22"); 
                }); 

               }]; 

NSLog(@"5"); 
[dataTask resume]; 
NSLog(@"6"); 

ich alle Zahlen bekommen von der Haupt Ausführung gedruckt, aber die completionHandler wird nie ausgeführt. Ich habe das auch mit einem Delegierten versucht, ohne Erfolg.

Vielen Dank im Voraus.

EDIT Wie bereits angedeutet, habe ich meine Funktion wie folgt geändert:

-(void) doGET{ 
    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration  defaultSessionConfiguration]; 
    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 
    NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:[self url] 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
                  NSLog(@"11"); 
                  if(error == nil) 
                  { 
                   NSString * text = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
                   NSLog(@"Data = %@",text); 
                  } 
                  NSLog(@"22"); 

                }]; 
    [dataTask resume]; 

} 

Mein ist Abschluss-Manager noch nicht laufen zu bekommen. Ich habe auch mit der sharedSession versucht, anstatt eine Konfiguration zu übergeben, aber auch kein Glück.

Danke für die Hilfe

+0

Haben Sie jemals diesen Code zum Funktionieren gebracht? Mein Code ist fast identisch (ich denke, wir haben die gleichen Websites besucht) und ich kann auch nicht den Abschlusscode-Block abrufen. Ich benutze meinen Code jedoch als Einheitentest mit dem iOS-Simulator 7.1, und ich frage mich, ob dies Auswirkungen hat. Ich habe auch an der 'NSURLSession' herumgebastelt und nichts half mir dabei. Ich habe bemerkt, dass Sie die Frage als beantwortet markiert haben, aber es ist immer noch nicht klar, was die Antwort war? –

Antwort

5

Wenn Sie den Abschluss Block Wiedergabe der Daten Aufgabe verwenden werden, anstatt eine delegate von nil, wie diese Angabe:

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject 
                  delegate: nil 
                 delegateQueue: [NSOperationQueue mainQueue]]; 

Sie stattdessen instanziiert sollten Ihre Sitzung unter Verwendung des Verfahrens, das keine delegate überhaupt nicht nehmen: dass Sie

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject]; 

Oder alternativ gegeben‘ re nicht Ihre Konfiguration an allen Customizing können Sie die Instanziierung der NSURLSessionConfiguration ganz und verwenden Sie die NSURLSession gemeinsame überspringen:

NSURLSession *defaultSession = [NSURLSession sharedSession]; 

Aber unterm Strich, sollen Sie nicht die sessionWithConfiguration:delegate:queue: Wiedergabe verwenden, wenn Sie das implementieren gehen Delegaten, in diesem Fall würden Sie nicht die Wiedergabe der NSURLSessionDataTask Methode mit dem completionHandler Parameter verwenden.

Stellen Sie außerdem sicher, dass auf Ihrem Gerät/Simulator iOS 7.0 oder höher ausgeführt wird.

+0

Ich habe versucht, dies mit verschiedenen Ansätzen zu tun: mit einem benutzerdefinierten Delegierten, den Vorschlag, den Sie gaben und den, den ich oben gepostet habe. Das Problem ist, dass ich die NSLog-Aktionen nicht innerhalb des Completion-Handlers (oder des Delegaten, wenn ich ihn benutzt habe) erhalte. Mein Code ist ein bisschen eine Mischung aus allen Ansätzen, die ich gemacht habe, also ist es wahrscheinlich nicht am besten, aber ich kann weder den Delegaten noch den Completion-Handler bekommen, um etwas zu drucken. Ich bin mir nicht sicher, warum alles, was ich gelesen habe, darauf hinweist, dass es sollte. Weißt du, ob es noch einen anderen Grund gibt, den CompletionHander nicht auszuführen? Danke im Advance – ylc

+0

Ich habe den Post mit deinem Vorschlag bearbeitet, aber selbst mit der neuen Funktion bekomme ich keine Reaktion vom AbschlussHandler – ylc

+0

@ user3214816 Are Sie laufen auf iOS 7? Wenn Sie auf iOS 6.1 laufen, erhalten Sie keine Ausnahme (worüber ich überrascht bin), sondern "defaultSession" wird "nil", genauso wie "dataTask". Abgesehen von diesem Szenario weiß ich nicht, warum es nicht funktionieren würde, weil Ihr Code auf meinem iOS 7.x-Gerät und iOS 7.x-Simulator funktioniert. Ich würde vorschlagen, 'defaultSession' und' dataTask' zu protokollieren und zu sehen, ob Sie gültige Objekte zurückbekommen. – Rob

0

Überprüfen Sie die Position Ihres Codes.

Obwohl es nicht in OP angegeben wo der Code befindet, fand ich, nach viel suchen und viele Iterationen, dass Beispielcode in -viewDidLoad ausgeführt setzen nie den Abschluss Handler. Bewegen Sie den Code in

- (void)viewWillAppear:(BOOL)animated { } 

löste die nie Aufgabe Ausgabe abgeschlossen ist. (Ich verstehe immer noch nicht warum.)