Всегда получает значение nil от функции в iOS

Я использую AFNetworking для некоторых запросов GET. Но моя функция всегда возвращает значение nil. Где я был неправ?

+ (NSString *)getRequestFromUrl:(NSString *)requestUrl { NSString * completeRequestUrl = [NSString stringWithFormat:@"%@%@", BASE_URL, requestUrl]; __block NSString * results; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:completeRequestUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { results = [NSString stringWithFormat:@"%@", responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { results = [NSString stringWithFormat:@"Error"]; }]; NSLog(@"%@", results); return results; } 

Спасибо! Артем.

Вы не видите результат, потому что блоки, которые вы передаете для success и failure выполняются асинхронно; к моменту выхода вашего NSLog веб-служба еще не вернется. Если вы переместите NSLog внутри своих блоков успеха и отказа, вы увидите, что результат будет выводиться на консоль.

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

 + (void)getRequestFromUrl:(NSString *)requestUrl withCompletion:((void (^)(NSString *result))completion { NSString * completeRequestUrl = [NSString stringWithFormat:@"%@%@", BASE_URL, requestUrl]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:completeRequestUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSString *results = [NSString stringWithFormat:@"%@", responseObject]; if (completion) completion(results); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSString *results = [NSString stringWithFormat:@"Error"]; if (completion) completion(results); }]; } 

Затем вы вызовете свой метод следующим образом:

 [YourClass getRequestFromUrl:@"http://www.example.com" withCompletion:^(NSString *results){ NSLog(@"Results: %@", results); } 

Пример проекта AFNetworking имеет пример использования параметра блока для возврата значения из вызовов веб-службы: https://github.com/AFNetworking/AFNetworking/blob/master/Example/Classes/Models/Post.m

 - (void)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block progress:(nullable void (^)(NSProgress * _Nonnull))uploadProgress success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure { [_manager POST:[NSString stringWithFormat:@"%@%@",API_HOST,URLString] parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { block(formData); } progress:^(NSProgress * _Nonnull uploadProgress1) { uploadProgress(uploadProgress1); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { success(task,responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { failure(task,error); }]; } 
  • Сбой при ;
  • Что такое профиль Bluetooth iBeacon
  • shazam для распознавания голоса на iphone
  • iOS - Строка платформы устройств / Внутренняя модель для iPhone 8, 8 Plus и iPhone X
  • Отправить push-уведомление с использованием GCM для нескольких тем одновременно в ios #ios # google-cloud-messaging
  • Как изменить чувствительность касания и перетаскивания?
  • Firebase - невозможно войти в facebook auth
  • Strange CoreData error ... значение, возвращаемое из insertNewObjectForEntityForName: похоже, повреждено
  • Как определить данные для каждого приложения на iOS
  • Образцы файлов в папке документов после установки приложения
  • Facebook / Мобильные ссылки с глубокой связью + приложения
  • Давайте будем гением компьютера.