2013-06-24 2 views
1

Я работаю с AFNetworking, чтобы получить JSON из Интернета. Как я могу получить ответ от возвращенного асинхронного запроса? Вот мой код:Ожидание завершения AFJSONRequestOperation

- (id) descargarEncuestasParaCliente:(NSString *)id_client{ 

     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://whatever.com/api/&id_cliente=%@", id_client]]]; 

     __block id RESPONSE; 

     AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 

      RESPONSE = JSON; 

     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
      NSLog(@"ERROR: %@", error); 
     }]; 

     [operation start]; 

     return RESPONSE; 
    } 

ответ

3

Я думаю, вы смущены тем, как работают блоки.

Это асинхронный запрос, поэтому вы не можете вернуть какое-либо значение, вычисленное внутри блока завершения, так как ваш метод уже возвращен при его выполнении.

Вы должны изменить свой дизайн либо выполнить обратный вызов внутри блока успеха, либо передать свой собственный блок и вызвать его.

В качестве примера

- (void)descargarEncuestasParaCliente:(NSString *)id_client success:(void (^)(id JSON))success failure:(void (^)(NSError *error))failure { 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://whatever.com/api/&id_cliente=%@", id_client]]]; 

    __block id RESPONSE; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 

     if (success) { 
      success(JSON); 
     } 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     NSLog(@"ERROR: %@", error); 
     if (failure) { 
      failure(error); 
     } 
    }]; 

    [operation start]; 
} 

Вам будет вызывать этот метод, как следует

[self descargarEncuestasParaCliente:clientId success:^(id JSON) { 
    // Use JSON 
} failure:^(NSError *error) { 
    // Handle error 
}]; 
+0

Спасибо за пример кода! Но не изменит ли тип возврата функции в пустоту, в данном случае? –

+0

Вы абсолютно правы –

+0

Я так и думал. Ваша реализация действительно сработала. Большое спасибо! :) –