2011-11-29 7 views
9

estoy usando AFNetworking el registro de nuevos usuarios, todo funciona bien, pero en el siguiente bloque que tienen algunos problemas:AFNetworking, AFHTTPRequestOperation bloque de finalización lento a fuego Código

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:myRequest] autorelease]; 
operation.completionBlock =^{ 
    if ([operation hasAcceptableStatusCode]) { 
     NSLog(@"success"); 
     username.backgroundColor = [UIColor yellowColor]; 
    } else { 
     switch ([operation.response statusCode]) { 
      case 421:     
      { 
       NSLog(@"Username taken."); 
       username.backgroundColor = [UIColor yellowColor]; 
      } 
       break; 
      default: 
       break; 
     } 
    } 
}; 

Básicamente mi script del lado del servidor realiza una validación y dispara un código de estado HTTP (sé que 421 no es válido). Esto me permite saber qué salió mal en el servidor, esto funciona bien.

Mi problema es que cuando la respuesta vuelve, dispara el NSLog(@"success"); o NSLog(@"Username taken."); de inmediato, pero cualquier otro código se dispara unos segundos después.

¿Alguien puede arrojar algo de luz sobre esto, por favor?

+0

He encontrado una solución a este problema ahora. – iamsmug

+1

¿Puede publicarlo como respuesta, por favor, para que otras personas con el mismo problema puedan ver cómo lo resolvió? – JosephH

+0

Sí, lo hará, tuvo que esperar durante 8 horas, se publicará en breve. – iamsmug

Respuesta

32

Aquí está la solución a mi problema, esto es mucho mejor y un infierno de mucho más rápido:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    NSLog(@"success: %@", operation.responseString); 

    [SVProgressHUD dismissWithSuccess:@"Sucess!" afterDelay:2]; 
    [self saveContinue:operation.responseString]; 


} 
    failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error: %@", operation.responseString); 

} 
]; 

espero que esto ayuda a las personas.

+0

¡Esto me ayudó mucho! Eliminado el retraso después de completar el bloque. –

+0

¿Cómo puedo obtener el contenido en el bloque "error"? Obtuve un HTTP Status 400 en el bloque de falla con contenido en la respuesta. – TheFox

+0

operation.responseString lo haría. El único problema es que, en mi caso, a veces el responseString es nulo (incluso cuando sé que se enviaron datos) – elsurudo

0

Mi solución para este POST HTTP fue

NSData *data = [self.postBody dataUsingEncoding:NSUTF8StringEncoding]; 
      NSURL *url = [NSURL URLWithString:self.requestUrl]; 
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
      [request setURL:url]; 
      [request addValue:@"application/octet-stream" forHTTPHeaderField: @"Content-Type"]; 
      [request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; 
      [request setHTTPMethod:@"POST"]; 
      NSMutableData *requestBody = [NSMutableData data]; 
      [requestBody appendData:data]; 
      [request setHTTPBody:requestBody]; 
      AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
      operation.responseSerializer = [AFJSONResponseSerializer serializer]; 
      operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; 
      [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
       NSInteger statusCode = operation.response.statusCode; 
       [self requestFinished:responseObject andStatusCode:statusCode]; 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       [self requestFailed:error]; 
      }]; 
      [[self.requestManager operationQueue] addOperation:operation]; 

      [AFHTTPRequestOperation batchOfRequestOperations:[NSArray arrayWithObjects:operation, nil] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
      } completionBlock:^(NSArray *operations) { 
      }]; 

que encola una sola operación en el gestor de la operación en este caso.

Cuestiones relacionadas