2015-02-27 5 views
0

У меня есть NSDictionary, который получает данные от JSON, и теперь я хочу скомпилировать эти данные и заполнить tableView. Однако я сталкиваюсь с непредсказуемыми препятствиями. Моя задача - создать массивы и методы с правильными значениями (массивы изображений, текстовых значений и т. Д.). В настоящее время я использую AFNetworking. В одном методе я получаю JSON данные:Заполнение массива NSDictionary

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

self.dataDict = (NSDictionary*)responseObject; 

Для попытки создать четкий код я хочу, чтобы отделить другие методы, с помощью функций. Я пробовал:

-(void)setImageView{ 
    if (self.dataDict){ 
self.dataDictArray = [[self.dataDict valueForKey:@"id"] objectAtIndex:0]; 

Затем, когда я хочу использовать NSLog я сделать следующее:

NSLog(@"Check the array %@", [self.dataDictArray objectAtIndex:0]); 

Это бросить мне ошибку: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber objectAtIndex:]: unrecognized selector sent to instance

Очевидно, это означает, что нет ни одного объекта в индекс 0 в моем массиве. Но когда я сделал:

NSLog(@"Check the array %@", self.dataDictArray); 

Он показал мне в консоли, что мой массив заполнения с одним «ID» номер 3, который на самом деле первый идентификатор в NSDictionary.

Я хочу понять, как исправить правильные массивы, содержащие данные из NSDictionary, и что я сделал неправильно?

Response obj. выглядеть следующим образом:

(
     { 
     id = 3; 
     dog = "\U041a\U0430\U043a\U043e\U0439-\U0442\U043e \U043c\U0443\U0434\U0430\U043a \U043d\U0430\U043a\U0440\U0443\U0442\U0438\U043b"; 
     image = "cute_dog/116.jpg"; 
     score = 586; 
    }, 
     { 
     id = 115; 
     dog = "\U0422\U0430\U043d\U044f \U041a\U043b\U044e\U043a\U0432\U0438\U043d\U0430"; 
     image = "cute_dog/115.jpg"; 
     score = 481; 
    }, 

т.д.

Спасибо!

+1

Можете ли вы поместить часть 'responseObject'?Сделайте NSLog (@ "% @", responseObject); – iphonic

+0

@iphonic edit применяется, пожалуйста, посмотрите –

+0

См. Мой ответ http://stackoverflow.com/a/28764205/790842, это очистит ваши сомнения. – iphonic

ответ

2

Обычно, как вы говорите, у вас есть Array of Dictionaries. Поэтому вы должны выполнить следующие шаги для извлечения данных.

Step 1.

self.dataDictArray = (NSArray*)responseObject; 

Step 2.

self.dataDict=[self.dataDictArray objectAtIndex:0]; 

Step 3.

NSLog(@"ID = %@",[self.dataDict valueForKey:@"id"]); 

Простой.

Cheers.

+0

Это помогает, но почему вы хотите сделать массив из dict? Раньше NSDictionary работала очень хорошо, и я мог видеть результат в NSLog. –

+0

В соответствии с вашим ответом он возвращает массив не словарь, поэтому база должна быть только массивом, вы делаете это неправильно .. из понятия json, если данные начинаются с '(' его массив, а если начинается с '{' его словарь – iphonic

+0

еще один вопрос, когда я смотрю URL-адрес в браузере JSON-плагина, я мог видеть, что он действительно начинается с [then {. И в выходе NSLog это (тогда {. Значит ли это, когда он начинается с [then {(в браузере) это массив? –

1

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber objectAtIndex:]: unrecognized selector sent to instance

Obviously, it means that there is no object at index 0 in my array

Ваше понимание ошибки неверно. Там is объект с индексом 0, это просто не экземпляр NSDictionary, а NSNumber (номер 3, который вы упомянули). NSNumber не имеет метода, называемого objectAtIndex :, так что это причина ошибки.

Проверьте свой JSON-синтаксический анализ, вы, вероятно, сделали что-то не так.

+0

«Очевидно, это означает, что в индексе 0 в моем массиве нет объекта». Очевидно, что-то вроде этого. Причина в том, что mes Объект sageAtIndex отправляется объекту NSNumber. – gnasher729

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