NSURLSessionDataTask dataTaskWithURL gestionnaire d'achèvement de ne pas avoir à intervenir
J'ai été Objectif d'apprentissage de la C ces derniers temps, et j'ai décidé d'essayer de connexions.
Tout a été parfait avec NSURLConnection, jusqu'à ce que j'ai découvert qu'elle était dépassée, et essayé de travailler avec NSURLSession.
Je suis en train d'essayer un exemple très simple, mais n'arrive pas à obtenir mon application pour exécuter le code à l'intérieur de la fin du bloc.
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");
J'ai tous les numéros imprimés à partir de l'exécution principal, mais le completionHandler n'est jamais exécutée. J'ai aussi essayé ce à l'aide d'un délégué, sans succès.
Merci d'avance.
MODIFIER
Comme suggéré, j'ai changé ma fonction à la suivante:
-(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 accomplissement manager est toujours pas à obtenir l'exécuter. J'ai aussi essayé avec le sharedSession au lieu de passer d'une configuration, mais pas de chance non plus.
Merci pour l'aide
NSURLSession
et rien de tout ce qui a aidé. J'ai remarqué que vous avez marqués à la question comme réponse, mais c'est pas encore clair quelle a été la réponse?OriginalL'auteur ylc | 2014-03-24
Vous devez vous connecter pour publier un commentaire.
Si vous allez utiliser l'achèvement bloc interprétation des données de la tâche, plutôt que de spécifier une
delegate
denil
, comme ceci:Vous devez instancier votre session à l'aide de la méthode qui ne prend pas une
delegate
à tous:Ou, à défaut, étant donné que vous n'êtes pas la personnalisation de votre configuration, vous pouvez sauter l'instanciation de l'
NSURLSessionConfiguration
complètement et utilisez l'NSURLSession
:Mais, en bout de ligne, vous ne devez pas utiliser le
sessionWithConfiguration:delegate:queue:
rendu, sauf si vous allez mettre en œuvre les délégués, dans ce cas, vous n'utilisez pas le rendu de laNSURLSessionDataTask
méthode avec lecompletionHandler
paramètre.Aussi, assurez-vous que votre appareil/simulateur est en cours d'exécution iOS 7.0 ou plus.
J'ai édité le post avec votre suggestion, mais même avec la nouvelle fonction, je n'ai pas de réaction de la completionHandler
Exécutez-vous cette sur iOS 7? Si vous exécutez sur iOS 6.1, vous n'obtenez pas une exception (que je suis surpris par l'), mais plutôt,
defaultSession
seranil
, commedataTask
. Autres que que le scénario, je ne sais pas pourquoi ça ne marcherait pas, parce que votre code fonctionne très bien sur mon iOS 7.x l'appareil et iOS 7.x simulateur. Je vous suggère de journalisationdefaultSession
etdataTask
, et voir si vous obtenez des objets valides en arrière.Je courais sur une application en ligne de commande, comme je viens de le tester avant de faire le trou app. Merci, avec l'application réelle, il fonctionne très bien!
Lors de la recherche sur internet, il existe de nombreux exemples de la publication des données qui suit exactement le même code que l'OP a présenté (par exemple, utilisation de l'achèvement du bloc interprétation des données de la tâche). Donc, si nous suivons votre conseiller (pas de délégué, ainsi, pas de l'achèvement de l'îlot), comment sommes-nous censés le processus de la réponse HTTP? Si nous ne sommes tout simplement la poste et ne se soucient pas de la réponse, je ne vois pas comment ce conseil serait utile (sauf si il y a une autre façon de s'accrocher dans la fonction de rappel une fois la réponse HTTP est livré à travers).
OriginalL'auteur Rob
Vérifier l'emplacement de votre code.
Bien qu'il n'est pas indiqué dans l'OP où le code a été localisé, j'ai trouvé, après beaucoup de recherche et de nombreuses itérations, qui met l'échantillon de code dans
-viewDidLoad
jamais exécuté le gestionnaire d'achèvement. Déplacer le code dansrésolu le jamais remplir tâche en question. (Je ne comprends toujours pas pourquoi.)
OriginalL'auteur David