Usando RestKit para realizar una request síncrona

- (BOOL)do_a_Restkit_request_and_return_a_boolean { [manager postObject:nil path:@"/mypath" parameters:@{@"password":password} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { myResult = [mappingResult firstObject] == 5; } failure:^(RKObjectRequestOperation *operation, NSError *error) { }]; return myResult; } 

Hola, me gustaría hacer una llamada de RestKit como la anterior Synchronous para devolver myResult después de la llamada del bloque Success.

Puede usar un enfoque como este:

 NSMutableURLRequest *request = // create a request… RKObjectRequestOperation *operation = [manager objectRequestOperationWithRequest:request success:nil failure:nil]; [operation start]; [operation waitUntilFinished]; BOOL myResult = NO; if (!operation.error) { myResult = [operation.mappingResult firstObject] == 5; } return myResult; 

Notas:

  • Los bloques de finalización se llaman después de que la operación finaliza, por lo que si proporciona bloques de éxito / falla, no serán llamados hasta después de que el método regrese
    • (Esta es la razón por la que sugiero que pases a nil en los bloques de finalización).
  • waitUntilFinished bloqueará cualquier hilo en el que esté, así que asegúrese de que no sea el hilo principal.
  • Si necesita ayuda para crear request , consulte Creación de objects de request en la Referencia de class de RKObjectManager .
  • Una vez más, si puede reescribir su código para trabajar de forma asíncrona, probablemente será mejor que esta solución.

Debe adoptar la naturaleza asíncrona de la comunicación de networking y el procesamiento en segundo plano de la respuesta, o utilizar una API / tecnología diferente específicamente para realizar requestes síncronas. RestKit y AFNetworking se basan más en el primero.

Adoptar asíncrono es la mejor opción …

Dicho esto, puede usar RestKit para crear NSURLRequest , luego usar NSURLConnection para download sincrónicamente la respuesta, luego usar RKMapperOperation para realizar la asignación (y esperar a que se complete con addOperations:waitUntilFinished: .