2013-09-23 2 views
0

Je ne vois pas ces deux méthodes appelées quand je commence mon NSURLConnection:NSURLConnection appel de méthode délégué seulement dans viewDidLoad

-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; 
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

Cela a fonctionné quand j'ai créé NSURLConnection dans viewDidLoad mais quand j'ai appelé ce d'une autre fonction, je ne vois pas canAuthenticateAgainstProtectionSpace appelé. Voici comment je crée mon NSURLConnection:

[UIApplication sharedApplication].networkActivityIndicatorVisible=YES; 
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[connection start]; 
+0

oui vous avez raison Rob – ThananutK

Répondre

0

Si rien d'autre, ne remet pas start conjointement avec initWithRequest:delegate:. Cela commence déjà la demande, donc l'appel manuel à start tente de le démarrer une deuxième fois, souvent avec des résultats contre-productifs.

Vous ne devez appeler start que si vous avez appelé initWithRequest:delegate:startImmediately: avec NO pour ce troisième paramètre.

En outre, si cette connexion est appelée dans une file d'attente autre que le thread principal, il se peut également que les méthodes NSURLConnectionDelegate et NSURLConnectionDataDelegate ne soient pas appelées. Mais, encore une fois, vous ne devriez pas mettre à jour l'interface utilisateur dans un thread d'arrière-plan, donc, je suppose que vous n'essayez pas de le faire dans un thread d'arrière-plan.

Donc, si ce faisant à partir d'un fil d'arrière-plan, vous pourriez faire:

// dispatch this because UI updates always take place on the main queue 

dispatch_async(dispatch_get_main_queue(), ^{ 
    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES; 
}); 

// now create and start the connection (making sure to start the connection on a queue with a run loop) 

NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 
[connection start]; 

J'utilise [NSRunLoop mainRunLoop] ci-dessus. Certaines implémentations (comme AFNetworking) utilisent un autre thread sur lequel l'application a explicitement démarré une autre boucle d'exécution. Le point principal, cependant, est que vous n'utilisez que start en conjonction avec startImmediately:NO, et vous n'utilisez que startImmediately:NO si vous le faites sur quelque chose d'autre que la boucle d'exécution du thread en cours.

Si ce faisant de la file d'attente principale déjà, il est juste:

[UIApplication sharedApplication].networkActivityIndicatorVisible=YES; 
NSURLRequest *request = [NSURLRequest requestWithURL: [NSURL URLWithString:video_link1]]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
// [connection start]; // don't use this unless using startImmediately:NO for above line 
+0

maintenant je déclare NSURLConnection * connexion à utiliser au niveau mondial et connexion = [[NSURLConnection alloc] initWithRequest: délégué de la demande: soi]; est dans viewdidload et [start de connexion]; prêt pour connecter le bouton .Im fait le droit? – ThananutK

+0

@ThananutK Non. Vous ne devriez probablement pas utiliser 'start', sauf si vous devez absolument utiliser le rendu' startImmediately' pour une raison quelconque (par exemple, vous devez utiliser la méthode 'scheduleInRunloop' car vous le faites dans une file d'attente d'arrière-plan). Sinon, faites 'initWithRequest: delegate:' lorsque vous cliquez sur votre bouton, mais ne faites pas 'start' du tout. – Rob

+0

c'est ce que je viens avec ---> connexion = [[NSURLConnection alloc] initWithRequest: demande délégué: self startImmediately: YES]; [connexion scheduleInRunLoop: [NSRunLoop currentRunLoop] pourMode: NSRunLoopCommonModes]; <- – ThananutK

Questions connexes