iOS: AFNetworking: repite un bloque si el token expiró

Estoy escribiendo una aplicación de networkinges sociales, donde los usuarios podrán seguir a otros usuarios y sus actividades.

En el lado del server, cada usuario se identifica con un token que expira después de 60 minutos.

Si el token ha caducado y el usuario desea llamar al método - (void) followUserWithID:(NSNumber *)targetUserID . Haría para este método llamar primero a mi autologinMethod (para garantizar que el token del usuario ahora sea válido) y luego repetir - (void) followUserWithID:(NSNumber *)targetUserID

Nota : No deseo tener una request "checkValidToken" que inicie una request HTTP adicional.

 -(void)commandWithParams:(NSMutableDictionary*)params command:(NSString *)command onCompletion:(JSONResponseBlock)completionBlock { NSString *_path = [NSString stringWithFormat:@"%@%@",self.baseURL, command]; NSLog(@"path: %@", _path ); NSMutableURLRequest *apiRequest = [self multipartFormRequestWithMethod:@"POST" path:_path parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) { //TODO: attach file if needed }]; AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //success! NSLog(@"%@",responseObject); completionBlock(responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //failure :( completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"ERROR"]); // Unable to establish a connection to the server. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Server error" message:@"Please try again later" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; }]; [operation start]; } - (void)followUserWithID:(NSNumber *)targetUserID { NSNumber *ownID = [[NSUserDefaults standardUserDefaults] objectForKey:@"id"]; NSMutableDictionary *HTTPPostDictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys: ownID, @"target_user_id", targetUserID, @"user_id",nil]; [[WebAPI shanetworkingInstance] commandWithParams:HTTPPostDictionary command:@"follow_user" onCompletion:^(NSDictionary *json){ NSLog(@"%@", json); }]; } 

Necesitas

  1. verifique si el token es válido en el bloque de finalización de AFNetworking
  2. si el token ha caducado, renuévalo y vuelva a intentar la operación

Según el código de estado HTTP que proporcione su server en este caso, su cheque estará en el bloque de success o failure .

Aquí hay un esquema aproximado:

 if (/* the token has expinetworking */) { AFHTTPRequestOperation *operationToRetryAfterTokenRenewal = [operation copy]; //TODO: set the completion blocks for operationToRetryAfterTokenRenewal. [myTokenRenewer autologinMethodWithCompletionBlock:^{ [operationToRetryAfterTokenRenewal start]; }]; } 

Dos notas:

  1. Tenga en count el TODO. Cuando copy un object AFHTTPRequestOperation , los bloques de finalización no persisten, por lo que debe configurarlos nuevamente. (Consulte las Advertencias NSCopying NSO de Operación AFURLConnection para get más información).
  2. Realmente debería utilizar [[myHTTPClient shanetworkingClient] enqueueHTTPRequestOperation:operation] lugar de [operation start] , especialmente si va a upload files. Esto permite que el sistema controle cuántas operaciones se ejecutan a la vez y retrasa su ejecución si hay una pausa temporal en la accesibilidad de la networking.