web-dev-qa-db-fra.com

Les méthodes déléguées NSURLConnection ne sont pas appelées

J'essaie de créer un simple NSURLConnection pour communiquer avec un serveur à l'aide d'une demande GET. La connexion fonctionne bien, mais les méthodes déléguées de NSURLConnection ne sont jamais appelées.

Voici ce que je fais:

NSString *post = [NSString stringWithFormat:@"key1=%@&key2=%@&key3=%f&key4=%@", val1, val4, val3, val4];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease] ;

[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.domain.com/demo/name/file.php?%@", post]]];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];

Ont implémenté les méthodes déléguées suivantes, mais aucune d'entre elles n'est appelée ..

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"did fail");
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"did receive data");
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    NSLog(@"did receive response ");
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"did finish loading");
    [connection release];
}

Suis-je en train de manquer quelque chose?

56
Manish Ahuja

Essayez d'exécuter l'opération sur le thread principal:

NSURLConnection * connection = [[NSURLConnection alloc] 
                                initWithRequest:request
                                       delegate:self startImmediately:NO];

[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] 
                      forMode:NSDefaultRunLoopMode];
[connection start];
136
Art

Appelez-vous cela sur un fil d'arrière-plan? Si vous effectuez cette opération sur un thread d'arrière-plan, le thread se termine probablement avant que les délégués puissent être appelés.

22
visakh7

Essayez de vérifier la longueur de la réponse reçue, elle ne devrait pas obtenir 0 octet de données.

1
sanjeev sharma

En plus de vérifier si la demande est appelée à partir du thread principal, vous pouvez vérifier si vous redonnez du temps d'exécution au système (si vous quittez "main"). J'avais un code de test qui resterait dans une boucle jusqu'à ce que le délégué soit appelé: il ne serait jamais appelé, car le système doit faire des choses pour que le délégué soit appelé, dans le thread principal.

1
user3292568