2010-02-21 6 views
5

J'utilise la bibliothèque ASIHTTPRequest pour demander des données à un serveur de mon application iPhone. Mais je ne peux pas comprendre comment créer un délai d'attente de sorte que si le serveur tombe en panne ou l'iPhone n'a pas de connexion Internet, l'application ne plante pas.Délai d'attente d'une demande ASIHTTP

Merci à l'avance

EDIT >>>

tt.Kilew votre travail ne marche pas de code ... J'affiché un peu de code exemple

NSURL *url = [NSURL URLWithString:@"A URL WITH A FORM"]; 
ASIFormDataRequest *requestPOST = [ASIFormDataRequest requestWithURL:url]; 
[requestPOST setPostValue:un forKey:@"username"]; 
[requestPOST setPostValue:pw forKey:@"password"];   
[requestPOST setPostValue:@"Login" forKey:@"submit"]; 
[requestPOST start]; 

[requestPOST setTimeOutSeconds:10]; 

NSLog(@"Fail: %@", [requestPOST failWithError:ASIRequestTimedOutError]); 

Répondre

16
[request setTimeOutSeconds:10]; 

Mise à jour avec plus code:

NSURL *url = [NSURL URLWithString:@"A URL WITH A FORM"]; 
ASIFormDataRequest *requestPOST = [ASIFormDataRequest requestWithURL:url]; 
[requestPOST setPostValue:un forKey:@"username"]; 
[requestPOST setPostValue:pw forKey:@"password"];   
[requestPOST setPostValue:@"Login" forKey:@"submit"]; 
[requestPOST setTimeOutSeconds:10]; 
[requestPOST setDelegate:self] 
[requestPOST startAsynchronous]; 

gestionnaire a échoué:

- (void)requestFailed:(ASIHTTPRequest *)request { 
    NSError *error = [request error]; 
    if ([error isKindOfClass:[ASIRequestTimedOutError class]]) { 
     // Actions specific to timeout 
    } 
} 

gestionnaire succès:

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

    // Use when fetching binary data 
    NSData *responseData = [request responseData]; 

    // Do something with the response. 
} 
+0

Est-ce que cela retourne quelque chose? parce que je dois avoir une déclaration comme si (délai d'attente == true) {// Certains message d'erreur } else {// Passez à l'étape suivante } –

+1

Cela indique simplement votre demande qu'il devrait expire au bout de 10 secondes. Si la requête expire, elle appellera votre requestFailed: delegate que vous pouvez vérifier pour l'ASIRequestTimedOutError (comme expliqué par tt.Kilew ci-dessous). – chrissr

+0

Pouvez-vous s'il vous plaît poster quelques exemples de code que je ne peux pas obtenir à travailler du tout –

0
// Number of seconds to wait before timing out - default is 10 
NSTimeInterval timeOutSeconds; 

Si surviendra délai d'attente, vous recieve

[self failWithError:ASIRequestTimedOutError]; 
+0

cela ne fonctionne pas regarder l'exemple de code que j'ai posté s'il vous plaît –

8

Je vérifie normalement comme ceci:

- (void)requestFailed:(ASIHTTPRequest *)request 
{  
    NSString *message = NULL; 

    NSError *error = [request error]; 
    switch ([error code]) 
    { 
     case ASIRequestTimedOutErrorType: 
      message = kAlertMsgTimeoutError; 
      break; 
     case ASIConnectionFailureErrorType: 
      message = kAlertMsgConnectionFailError; 
      break; 
     case ASIAuthenticationErrorType: 
      message = kAlertMsgAuthFailError; 
      break; 
     case ASITooMuchRedirectionErrorType: 
      message = kAlertMsgTooManyRedirect; 
      break; 
     case ASIRequestCancelledErrorType: 
      message = kAlertMsgReqCancelledError; 
      break; 
     case ASIUnableToCreateRequestErrorType: 
      message = kAlertMsgUnableCreateReqError; 
      break; 
     case ASIInternalErrorWhileBuildingRequestType: 
      message = kAlertMsgUnableBuildReqError; 
      break; 
     case ASIInternalErrorWhileApplyingCredentialsType: 
      message = kAlertMsgUnableApplyCredError; 
      break; 
     case ASIFileManagementError: 
      message = kAlertMsgFileManageError; 
      break; 
     case ASIUnhandledExceptionError: 
      message = kAlertMsgUnhandledExcepError; 
      break; 
     case ASICompressionError: 
      message = kAlertMsgCompressionError; 
      break; 
     default: 
      message = kAlertMsgGenericError; 
      break; 
    } 

    if (NULL != message) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:kApplicationTitle 
                 message:message 
                 delegate:self 
               cancelButtonTitle:kAlertDefaultCancel 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 
+0

quelle classe je vouloir ajouter pour cette méthode ????? –

+0

Merci pour cela, cela fonctionne très bien. – AndyGable