No se puede recuperar un JSON de POST: types de puntero de bloque incompatibles

Escribí un método POST que necesita devolver un jSON al viewcontroller que la llamó. Si agrego el éxito block return _jsonDictionary; Voy a recibir este error:

Incompatible block pointer types sending 'id (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)' to parameter of type 'void (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)'

Supongo que debido a que es asíncrona, agregar un retorno lo obligará a ser sincrónico, pero quiero que todos mis methods POST para mi aplicación estén en una class, para que los datos salgan de JSON a las variables que se declaran en mi aplicación con algo like valueForKey hace las cosas un poco complicadas para mí. ¿Es ese mal layout?

  -(NSDictionary *)getData { _jsonDictionary = [[NSDictionary alloc]init]; NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/getSomething",MainURL ]]; [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:nil parameters:nil]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { _jsonDictionary = JSON; NSLog(@"jsonDictionary: %@",_jsonDictionary); } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) { NSLog(@"request: %@",request); NSLog(@"Failed: %@",[error localizedDescription]); }]; [httpClient enqueueHTTPRequestOperation:operation]; } 

Otra pregunta, ¿por qué recibo esta advertencia al final del código anterior: El Control reaches end of non-void function incluso si cambio el nombre del método en .m y en .h a -(void )getData ?

Si su principal preocupación es "recuperar" sus datos, tiene tres forms (quizás más, pero solo puedo cosas de esas tres):

  1. En su método getData , puede publicar una NSNotification que se suscribió su viewController antes de llamar a getData
  2. si está utilizando (o planea usar) un gestor de datos como un singleton, su viewController puede KVO en la propiedad @ del gestor de datos
  3. mi favorito: en su viewController que llama, usted construye y pasa un bloque al método getData que se llamará (con o sin el resultado). Esto es exactamente lo que está haciendo al crear AFJSONRequestOperation en su ejemplo.

El error que obtienes es correcto. El bloque no debe devolver nada, y tu return _jsonDictionary; Está intentando eso.

Lo que necesita hacer es actualizar _jsonDictionary dentro del bloque de éxito (como ya lo hizo), y luego invocar otra function para [self.tableView refreshData] events que actualicen su interfaz de usuario (algo así como llamar a [self.tableView refreshData] ).

estás mezclando totalmente asyn y sync … hay válido no _jsonDictionary que getData podría volver. el _jsonDictionary solo se rellena de forma asíncrona cuando se llaman los bloques de finalización.

debe proceder desde allí … llamar a otro método, por ejemplo


en cuanto al error / advertencia que ves … se supone que getData devuelve algo (NSDictionary *) o un void * (casi equivalente a un id)

para no devolver cosas, solo es nulo.