2015-03-24 3 views
-1

У меня есть следующий код, который анализирует json в пользовательских объектах, синтаксический анализ работает отлично, у меня проблема с сохранением объектов.объект не сохраняется в массиве

-(void)handleCities:(NSNotification *)notification 
{ 
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"_getInitialData" object:nil]; 

if(![notification object]) 
{ 
    NSLog(@"Something went wrong"); 

    return; 
} 

// Convert data to a dictionary 
NSMutableDictionary * data = [NSJSONSerialization JSONObjectWithData:(NSMutableData *) [notification object] options:NSJSONReadingMutableContainers error:nil]; 

// Loop over all the data 
if([data objectForKey:@"data"] != (id)kCFBooleanFalse) 
{ 
    for(int i = 0; i < [[[data objectForKey:@"data"] objectForKey:@"cities"] count]; i++) 
    { 
     CityObject * object = [[CityObject alloc] init]; 

     // Loop over all the properties 
     for(NSString * key in [[[data objectForKey:@"data"] objectForKey:@"cities" ] objectAtIndex:i]) 
     { 
      NSString * _key = key; 

      if([object._remap objectForKey:key]) 
      { 
       NSString * value = [object._remap objectForKey:_key]; 

       NSLog(@"Notice [%@] Remapping \"%@\" to \"%@\"", self.class, _key, value); 

       _key = value; 
      } 

      // Save the value for easy access 
      NSString * value = [[[[data objectForKey:@"data"] objectForKey:@"cities" ] objectAtIndex:i] objectForKey:_key]; 

      // Does the value have a value 
      if((id)value == [NSNull null]) 
      { 
       value = @""; 
      } 

      // Set the value for key 
      [object setValue:value forKey:_key]; 
     } 

     NSMutableDictionary * set = [[[data objectForKey:@"data"] objectForKey:@"cities"] objectAtIndex:i]; 

     int count = (int)[[set objectForKey:@"categories"] count]; 

     for(int b = 0; b < count; b++) 
     { 
      CategoryObject * category = [[CategoryObject alloc] init]; 

      for(NSString * key in [[set objectForKey:@"categories"] objectAtIndex:b]) 
      { 
       NSString * value = [[[set objectForKey:@"categories"] objectAtIndex:b] objectForKey:key]; 

       if((id)value == [NSNull null]) 
       { 
        value = @""; 
       } 

       [category setValue:value forKey:key]; 
      } 

      NSLog(@"Category %@",category.class); 
      NSLog(@"Object : %@",object.class); 
      NSLog(@"Object Categories : %@",object.categories.class); 

      // i can print the category object fine here 

      [object.categories addObject:(CategoryObject *)category]; 
     } 

     [self.cities addObject:object]; 
    } 
} 

CityObject * city = [self.cities objectAtIndex:0]; 
CategoryObject * category = [city.categories objectAtIndex:0]; 
NSLog(@"Category Name : %@", category.name); 

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"_getInitialData" object:nil]; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"getInitialData" object:nil]; 
} 

CityObject.h

#import <Foundation/Foundation.h> 
#import "Object.h" 

@interface CityObject : Object 

@property (nonatomic, strong) NSString * name; 
@property (nonatomic, strong) NSString * id; 
@property (nonatomic, strong) NSString * state; 
@property (nonatomic, strong) NSString * image; 
@property (nonatomic, strong) NSString * term_order; 

@property (nonatomic, strong) NSMutableArray * categories; 

@property (nonatomic, strong) NSMutableDictionary * _remap; 


@end 

CityObject.m

#import "CityObject.h" 

@implementation CityObject 

-(id)init 
{ 
if(self = [super init]) 
{ 
    self._remap = [[NSMutableDictionary alloc] init]; 
    self.categories = [[NSMutableArray alloc] init]; 

    [self._remap setObject:@"state" forKey:@"new_city"]; 
} 

return self; 
} 

@end 

CategoryObject.h

#import <Foundation/Foundation.h> 
#import "Object.h" 

@interface CategoryObject : Object 

@property (nonatomic, strong) NSString * name; 
@property (nonatomic, strong) NSString * icon; 
@property (nonatomic, strong) NSString * id; 

@end 

Прежде чем добавить объект CategoryObject в свой массив, я могу получить значения без проблем, когда i NSLog в конце я не могу получить значения/объекты из массива.

Что я делаю неправильно, так как он отлично работает, когда я добавляю CityObjects, но не тогда, когда я «разбираю» категории. Я может читать их в порядке, прежде чем я добавить их к object.categories

об ошибке/выход

-[__NSDictionaryM name]: unrecognized selector sent to instance 0x7a482760 
2015-03-24 09:21:05.649 10things[16968:337325] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM name]: unrecognized selector sent to instance 0x7a482760' 
+2

Этот фрагмент в сообщении об ошибке: '- [__ NSDictionaryM name]' Указывает на то, что вы * думаете * вы используете 'CityObject' (или' CategoryObject'), когда на самом деле вы используя «NSDictionary». Это происходит постоянно с JSON; люди просто не понимают типы объектов, которыми они манипулируют. – trojanfoe

+0

'NSLog (@" Категория% @ ", category.class);' 'NSLog (@" Object:% @ ", object.class);' 'NSLog (@" Категории объектов:% @ ", объект. category.class); ' Отдайте правильные классы назад, это пойдет не так, как только я добавлю их в массив. –

+2

« Непризнанный селектор »никогда не лежит ... – trojanfoe

ответ

0

Проблема решена, я не имел сильный указатель на модели, словарь был магически будучи замененным на NSMutableDictionary Как только у меня была сильная ручка, все работало правильно. (спасибо за обратную связь кода)

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