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
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.
Vérifiez l'emplacement de votre code.
bien qu'il ne soit pas indiqué dans L'OP où 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.)