Ответ AFNetworking отображается в журнале, но в отладчике равен нулю

Я использую AFNetworking для получения ответа JSON. Я получаю это как PhotoPXArray (модель, которую я создал с помощью мантии). Выход журнала – это именно те данные, которые я хочу. Моя проблема заключается в использовании данных. Когда я устанавливаю точку останова и смотрю на объект responseObject, он равен нулю. Я не знаю, почему журнал выкачивает данные, но в отладчике значение равно нулю.

То, что я в конечном счете пытаюсь сделать, это сохранить ответ, чтобы использовать его позже.

Кроме того, я использую Sculptor для сериализации.

-(NSArray*) getPhotoForWord:(NSString*)word { NSArray *results = nil; __block NSMutableDictionary *test = nil; NSString *requestString = BASE_URL; requestString = [requestString stringByAppendingString:@"photos/search?term="]; requestString = [requestString stringByAppendingString:word]; requestString = [requestString stringByAppendingString:CONSUMER_KEY]; NSString *encoded = [requestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [SCLMantleResponseSerializer serializerForModelClass:PhotoPXArray.class]; [manager GET:encoded parameters:nil //success:^(AFHTTPRequestOperation *operation, id responseObject) { success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"JSON: %@", responseObject); test = responseObject; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; return results; } 

Вы никогда не устанавливаете переменную results , поэтому, конечно, она вернет nil . Даже если вы использовали test (который вы установили), это происходит асинхронно, поэтому, когда вы сразу же вернетесь, оно будет равно nil , только позже получит значение responseObject .

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

 - (void)getPhotoForWord:(NSString*)word completionHandler:(void (^)(id responseObject, NSError *error))completionHandler{ NSString *requestString = BASE_URL; requestString = [requestString stringByAppendingString:@"photos/search?term="]; requestString = [requestString stringByAppendingString:word]; requestString = [requestString stringByAppendingString:CONSUMER_KEY]; NSString *encoded = [requestString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.responseSerializer = [SCLMantleResponseSerializer serializerForModelClass:PhotoPXArray.class]; [manager GET:encoded parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { if (completionHandler) { completionHandler(responseObject, nil); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (completionHandler) { completionHandler(nil, error); } }]; } 

Затем вы вызываете это так:

 [obj getPhotoForWord:word completionHandler:^(id responseObject, NSError *error) { // use responseObject here }]; // do not use it here because the above happens asynchronously (ie later) 

Похоже, вы ничего не приписываете. Единственное, что появляется в вашем коде 2 раза, – это когда вы его объявили: NSArray *results = nil; и когда вы его return results; : return results;

Похоже, что вам не хватает синтаксического анализа вашего test словаря и заполнения массива, а затем возврата?

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