Nsurlsessiondatastak dataTaskWithURL completion handler not getting called

j'ai appris L'objectif C récemment, et j'ai décidé d'essayer les connexions.

tout était génial avec Nslconnection, jusqu'à ce que je découvre qu'il était dépassé, et j'ai essayé de travailler avec Nslsession.

je suis en train d'essayer un exemple très simple, mais ne semble pas pouvoir obtenir mon application pour exécuter le code à l'intérieur du bloc d'achèvement.

voici le code utilisé:

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

je reçois tous les numéros imprimés de l'exécution principale, mais le completionHandler n'est jamais exécuté. J'ai aussi essayé avec un délégué, sans succès.

Merci d'avance.

MODIFIER Comme suggéré, j'ai changé ma fonction à ce qui suit:

-(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];

}

mon responsable de l'achèvement ne se fait toujours pas exécuter. J'ai aussi essayé avec la sharedSession au lieu de passer une configuration mais pas de chance non plus.

Merci pour l'aide

9
demandé sur Rob 2014-03-24 16:30:40

2 réponses

si vous allez utiliser le rendu de bloc d'achèvement de la tâche de données, plutôt que de spécifier un delegate de nil , comme ceci:

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

vous devriez instancier votre session en utilisant la méthode qui ne prend pas un delegate du tout:

NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject];

ou, alternativement, étant donné que vous ne personnalisez pas du tout votre configuration, vous pouvez sauter l'instanciation du NSURLSessionConfiguration et utiliser le partagé NSURLSession :

NSURLSession *defaultSession = [NSURLSession sharedSession];

mais, en fin de compte, vous ne devez pas utiliser le rendu sessionWithConfiguration:delegate:queue: à moins que vous n'utilisiez les délégués, auquel cas vous n'utiliseriez pas le rendu de la méthode NSURLSessionDataTask avec le paramètre completionHandler .

de plus, assurez-vous que votre appareil/simulateur exécute iOS 7.0 ou plus.

5
répondu Rob 2014-03-25 13:52:21

Vérifiez l'emplacement de votre code.

bien qu'il ne soit pas indiqué dans L'OP le code a été localisé, j'ai trouvé, après beaucoup de recherches et de nombreuses itérations, que la mise de code échantillon dans -viewDidLoad n'a jamais exécuté le handler d'achèvement. Déplacer le code dans

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

résolu le ne jamais compléter problème de tâche. (Je ne comprends toujours pas mais pourquoi les.)

0
répondu David 2016-02-19 15:21:09