2010-02-21 13 views
5

Estoy usando la biblioteca ASIHTTPRequest para solicitar algunos datos de un servidor en mi aplicación de iPhone. Pero no puedo imaginar cómo crear un tiempo de espera para que, si el servidor no funciona o si el iPhone no tiene conexión a Internet, la aplicación no se cuelgue.Expirar una solicitud ASIHTTP

Gracias de antemano

EDITAR >>>

tt.Kilew su código no funciona ... me ha escrito algo de código de ejemplo

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]); 

Respuesta

16
[request setTimeOutSeconds:10]; 

de actualización con más código:

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]; 

manejador Error:

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

éxito manejador:

- (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

¿Eso le devuelve algo? porque tengo que tener una declaración como si (tiempo de espera == true) {// Algunos mensaje de error } else {// proceder al siguiente paso } –

+1

Eso sólo le dice a su solicitud de que el tiempo de espera después de 10 segundos. Si la solicitud supera el tiempo de espera, se llamará a su solicitud. Enlatada: delegue la que puede verificar para ASIRequestTimedOutError (como se explica en tt.Kilew a continuación). – chrissr

+0

¿Puede por favor publicar un código de muestra? No puedo hacer que esto funcione en absoluto. –

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

Si se produce tiempo de espera, se le recibiera

[self failWithError:ASIRequestTimedOutError]; 
+0

Eso no funciona mira el código de muestra que publiqué –

8

que normalmente comprobar de esta manera:

- (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

qué clase i desea agregar para este método ????? –

+0

Gracias por esto, funciona genial. – AndyGable

Cuestiones relacionadas