Метод с именем не возвращен

У меня есть этот класс, который выполняет вызов REST.

- (NSString*)cerca:(NSString*)email{
if ([[Utility sharedUtility] connected]) {
    HttpClient *self = [HttpClient sharedHTTPClient];
    [self.requestSerializer setValue:[self getUserAgent] forHTTPHeaderField:@"User-Agent"];
    [self.requestSerializer setValue:NST_CODE forHTTPHeaderField:@"Nst-Code"];
    [self.requestSerializer setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"nst_id"] forHTTPHeaderField:@"Nst-Id"];
    [self.requestSerializer setValue:[[NSUserDefaults standardUserDefaults] objectForKey:@"api_key"] forHTTPHeaderField:@"Api-Key"];

    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"email"] = email;

    __block NSString *result;

    [self POST:@"get_info" parameters:parameters
       success:^(NSURLSessionDataTask *task, id responseObject) {

          result = responseObject;


       } failure:^(NSURLSessionDataTask *task, NSError *error) {


       }]; 
return result;

}

Вызов возвращает JSON . Моя проблема в том, что когда я возвращаю результат; Ничего не передается вызывающему методу. Ты можешь сказать мне, почему??

Метод вызова

HttpClient *client = [HttpClient alloc];
NSString *result = [client cerca:email];

3 ответа

Решение

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

- (void)cerca:(NSString*)email callback:(void (^)(id result)) callback {
   if ([[Utility sharedUtility] connected]) {
     ...

     [self POST:@"get_info" parameters:parameters
     success:^(NSURLSessionDataTask *task, id responseObject) {
        if (callback) { 
          callback(responseObject)
        }
     } failure:^(NSURLSessionDataTask *task, NSError *error) {


     }]; 
  }
}

Чтобы вызвать метод, вы должны сделать:

[client cerca:email completion:^(NSString *response) {
   // Do what you want with the response.
}];

Я изменил свой метод

- (NSString*)cerca:(NSString*)email completion:(void (^)(NSString *res))completion {

Но я не понимаю, как это назвать. Показания

[client cerca:email completion:nil];

Это потому что self POST вызов асинхронный, и вы возвращаете result прежде чем он успел быть назначен. Вы должны восстановить свой - (NSString*)cerca:(NSString*)email метод, так что он как-то может справиться с асинхронностью этого. Обычно проще всего изменить метод, чтобы он занимал блок завершения, как в параметре. Может быть что-то вроде:

        - (void)cerca:(NSString *)email completion:(void (^)(NSString *res))completion {
            [self POST:@"get_info" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
                if (completion) {
                    completion(responseObject);
                }
            }failure:^(NSURLSessionDataTask *task, NSError *error) {
                if (completion){
                    completion(nil);
                }
            }];
        }
Другие вопросы по тегам