El bloque de finalización AFNetworking espera hasta que se complete

Estoy usando AFNetworking para requestes POST. Necesito esperar hasta que se complete el bloque de finalización para devolver datos, y he tenido problemas.

Tenía una solución que funcionaba hasta que cambié a AFNetworking:

int i = 0; while (!done) { [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; i++; NSLog(@"While Loop:%i", i); if (i == 149) //request timed out done = YES; } 

Ahora, la solución funciona de forma esporádica. A veces se completa con NSLog(@"While Loop:%i", i); solo registra 1 o 2, pero a veces registra hasta 149 y times de espera. Parece que el NSRunLoop veces se ejecuta en un subprocess diferente, pero a veces se ejecuta en el mismo subprocess bloqueando mi request.

Aquí está el código que tengo actualmente:

 - (id)postRequestWithBaseURLString:(NSString *)baseURLString function:(NSString *)function parameters:(NSDictionary *)parameters { if (baseURLString) function = [baseURLString stringByAppendingString:function]; __block BOOL done = NO; __block id returnObject = nil; [self.manager POST:function parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success: %@", responseObject); done = YES; returnObject = responseObject; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); done = YES; }]; [manager.operationQueue waitUntilAllOperationsAreFinished]; int i = 0; while (!done) { [NSRunLoop.currentRunLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; i++; NSLog(@"While Loop:%i", i); if (i == 149) //request timed out done = YES; } return returnObject; } 

He intentado hacer un dispatch_group sin éxito. ¿Ayuda?

EDITAR

Ok, tengo más información. Mi solución funciona cuando llamo por primera vez a la API (por ejemplo, cuando llamo por primera vez a un ViewController ), pero no después. Tal vez, después de cargar la vista, se llama al ciclo while en el mismo subprocess que la llamada API, por lo tanto, bloquearlo?

Esto también parece probable, ya que el NSLog(@"Success: %@", responseObject); se llama casi exactamente después de que pase el time de espera.

Encontré una solución elegante en línea. Creé mi propio bloque de finalización. Esto es lo que hice:

 + (void)jsonRequestWithBaseURL:(NSString *)baseURL function:(NSString *)function parameters:(NSDictionary *)parameters completion:(void (^)(NSDictionary *json, BOOL success))completion { if (baseURL) function = [baseURL stringByAppendingString:function]; NSLog(@"%@ function:%@, parameters:%@", self.class, function, parameters); [AFHTTPRequestOperationManager.manager POST:function parameters:parameters success:^(AFHTTPRequestOperation *operation, id jsonObject) { //NSLog(@"Success: %@", jsonObject); NSDictionary *jsonDictionary = (NSDictionary *)jsonObject; if (completion) completion(jsonDictionary, YES); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@ AFError: %@", self.class, [error localizedDescription]); completion(nil, NO); }]; } 

Entonces, cuando necesito llamar al método, hago esto:

 NSDictionary *parameters = @{@"email":@"me@example.com", @"password":@"mypassword"}; [ZAPRootViewController jsonRequestWithBaseURL:@"http://www.myserver.com/" function:@"login.php" parameters:parameters completion:^(NSDictionary *json, BOOL success) { if (success) { //do something } }];