Afnetworking, bloque de finalización AFHTTPRequestOperation lento al código de fuego

StackOverflow https://stackoverflow.com/questions/8317785

  •  25-10-2019
  •  | 
  •  

Pregunta

Estoy usando AfNetworking registrando nuevos usuarios, todo funciona bien, pero en el siguiente bloque tengo algunos problemas:

    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 hace algo de 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 regresa, dispara el NSLog(@"success"); o NSLog(@"Username taken."); Inmediatamente, pero cualquier otro código se dispara de bastantes segundos después.

¿Alguien puede arrojar luz sobre esto, por favor?

¿Fue útil?

Solución

Aquí está la solución a mi problema, esto es mucho mejor y 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 ayude a la gente.

Otros consejos

Mi solución para la publicación http fue esta

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 enqueora una sola operación en el administrador de operaciones en este caso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top