2016-06-28 3 views
0

У меня есть функция, где тип возврата - «BOOL» и в тело функции. Вызов HTTP-запроса.Как вернуть значение функции из тела блока?

Если имеются данные, я хочу вернуть «Истину». Я хочу управлять синхронно.

- (BOOL) randomFunction { 
     NSURLSession *session = [NSURLSession sharedSession]; 
     [[session dataTaskWithRequest:mutableRequest completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
      if (data) { 
       NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error]; 
       NSString *status = (NSString *)[JSON valueForKey:@"enabled"]; 
       if ([status isEqualToString:@"true"]) { 
    //    return YES; // ERROR 
       } 
      } 
    //  return NO; // ERROR 
     }] resume]; 
} 

ERROR:

Incompatible block pointer types sending 'BOOL (^)(NSData * _Nullable __strong, NSURLResponse * _Nullable __strong, NSError * _Nullable __strong)' to parameter of type 'void (^ _Nonnull)(NSData * _Nullable __strong, NSURLResponse * _Nullable __strong, NSError * _Nullable __strong)'

+0

** Нет, вы не хотите его синхронно **. Даже если вы хотите, это плохая идея, она заблокирует ваше приложение во время веб-звонка (представьте людей в метро, ​​нет сети, ваше приложение должно быть убито). Проверьте мой ответ, я обновил его, чтобы он соответствовал вашим потребностям. – AnthoPak

+0

@ AnthoninC. спасибо за указание на темную сторону синхронного вызова в моем случае ... –

+1

Без проблем приятель, рад помочь. – AnthoPak

ответ

1

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

-(void)randomFunction:(void (^)(BOOL response))completionHandlerBlock { 
    NSURLSession *session = [NSURLSession sharedSession]; 
    [[session dataTaskWithRequest:nil completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
     if (data) { 
      NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error]; 
      NSString *status = (NSString *)[JSON valueForKey:@"enabled"]; 
      if ([status isEqualToString:@"true"]) { 
       completionHandlerBlock(YES); 
      } 
     } 
     completionHandlerBlock(NO); 
    }] resume]; 
} 

и использовать его так:

[self randomFunction:^(BOOL response) { 
    if (response) { 
     //handle response 
    } 
}]; 
+0

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

+0

Это не проблема. В 'if (response) {...}' введите свою бизнес-логику. Предоставляемый вами код не является синхронным, и все вызовы в WebServices должны быть асинхронными, чтобы не блокировать основной поток. – AnthoPak

Смежные вопросы