2010-07-08 5 views
0

me Riddle ceci: J'utilise un NSURLConnection sur un SDK iPhone Simulator 3.1.2 objet à émettre séquentiel multiple (non concurrente) demandes https. Tout fonctionne très bien 95% du temps, mais tout aussi souvent (peut-être autour de 50-100 demandes) je reçois la situation dans laquelle la méthode déléguéeNSURLConnection Réussi sans réponse HTTP

- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

est appelée après [connexion départ], mais sans tout appel à la méthode déléguée

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

J'ai réduit le problème à la source ci-dessous. D'après ce que je comprends, cela rompt le contrat du comportement défini de NSURLConnection. Est-ce que quelqu'un d'autre a eu ce problème, et est-ce un bug connu ou est-ce que j'utilise NSURLConnection mal?

static BOOL hasSeenResponse = NO; 

    //Create a NSURLConnection and start it 
-(void) begin { 
    NSURL* url = [NSURL [email protected]"https://some.domain.com/some/path/?some=query"]; 
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever]; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url]; 
    if ([NSURLConnection canHandleRequest:request]) { 
     NSURLConnection* connection = [[NSURLConnection connectionWithRequest:request delegate:self] retain]; 
     hasSeenResponse = NO; 
     [connection start]; 
    } 
}  

#pragma mark NSURLConnection Delegate Methods 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    if (!hasSeenResponse) { 
     NSLog(@"\n\nNo Response Recieved\n"); 
    } 
    [connection release]; 
    [self begin]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    [connection release]; 
    [self begin]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    hasSeenResponse = YES; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
} 

Répondre

0

j'ai pu résoudre le problème en ajoutant le délégué pour réoriente qui accepte toujours

-(NSURLRequest *)connection:(NSURLConnection *)connection 
      willSendRequest:(NSURLRequest *)request 
      redirectResponse:(NSURLResponse *)redirectResponse 
{ 
    return request; 
} 

Si je comprends bien, c'est le comportement par défaut donc je ne sais pas pourquoi Cela résout le problème.

L'URL à laquelle j'ai envoyé la demande a émis une redirection, mais cela n'explique pas non plus pourquoi la requête HTTP a fonctionné dans l'autre ~ 95% du temps. J'espère que cela aidera quelqu'un avec un problème similaire à l'avenir.