10 Stimmen

NSURLSessionDataTask dataTaskWithURL Completion-Handler wird nicht aufgerufen

Ich habe in letzter Zeit Objective C gelernt und entschieden, Verbindungen auszuprobieren.

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

Ich versuche ein sehr einfaches Beispiel, aber irgendwie schaffe ich es nicht, dass meine App den Code im Abschlussblock ausführt.

Hier ist der verwendete Code:

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

Alle Zahlen werden aus der Hauptausführung gedruckt, aber der Abschlussmanager wird nie ausgeführt. Ich habe es auch mit einem Delegaten versucht, ohne Erfolg.

Vielen Dank im Voraus.

EDIT Wie vorgeschlagen, 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 Abschlussmanager wird immer noch nicht ausgeführt. Ich habe es auch mit dem sharedSession versucht, anstelle einer Konfiguration zu übergeben, aber auch ohne Erfolg.

Vielen Dank für die Hilfe.

9voto

Rob Punkte 389782

Wenn Sie die Abschlussblock-Version der Datenaufgabe verwenden möchten, anstatt einen delegate von nil zu spezifizieren, sollten Sie das folgendermaßen tun:

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

Sie sollten stattdessen Ihre Sitzung mit der Methode instanziieren, die überhaupt keinen delegate benötigt:

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject];

Alternativ können Sie, wenn Sie Ihre Konfiguration überhaupt nicht anpassen, die Instanziierung des NSURLSessionConfiguration komplett überspringen und das gemeinsame NSURLSession verwenden:

NSURLSession *defaultSession = [NSURLSession sharedSession];

Aber im Grunde genommen sollten Sie die Version sessionWithConfiguration:delegate:queue: nicht verwenden, es sei denn, Sie werden die Delegierten implementieren, in welchem Fall Sie nicht die Version der Methode NSURLSessionDataTask mit dem completionHandler-Parameter verwenden würden.

Stellen Sie außerdem sicher, dass Ihr Gerät/ Simulator iOS 7.0 oder höher ausführt.

0voto

David Punkte 3255

Überprüfen Sie den Speicherort Ihres Codes.

Obwohl in OP nicht angegeben wird, wo sich der Code befand, fand ich nach langem Suchen und vielen Iterationen heraus, dass das Einfügen des Beispielscodes in -viewDidLoad niemals den Abschluss-Handler ausgeführt hat. Das Verschieben des Codes in

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

hat das Problem der niemals abgeschlossenen Aufgabe gelöst. (Ich verstehe jedoch immer noch nicht, warum.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X