iOS ¿Cómo puedo volcar múltiples properties de un object en un dictionary usando un pnetworkingicado o KVC?

Tengo una class que se hincha con properties y ahora hay alnetworkingedor de 30 de ellas, la mayoría de las cuales son types enumerados integers.

Mi código actualmente lo usa en varios lugares, y estoy intentando moverme suavemente a la nueva representación del dictionary.

Estoy buscando crear un dictionary de este object, pero solo incluyo valores que no son 0, (valores que tienen algunos datos).

¿Hay alguna magia de encoding de valor de objective-c que pueda ayudarme a simplificar la escritura de este método?

@property(nonatomic)kGrade grade; @property(nonatomic)kQuality quality; //a whole bunch more properties -(NSMutableDictionary*)itemAsDictionary { if(itemDictionary !=nil) { return itemDictionary; }else { itemDictionary = [[NSMutableDictionary alloc] initWithCapacity:40]; //I really dont want to write a whole bunch of such statements if(self.grade>0) { [itemDictionary setObject:@(self.grade) forKey:@"grade"]; } //add 39 other items } return itemDictionary; } 

 - (NSMutableDictionary *)itemAsDictionary { NSMutableDictionary *resultDic = [[NSMutableDictionary alloc] init]; unsigned int outCount, i; //type the name of the class you want to turn to dictionary objc_property_t *properties = class_copyPropertyList([Item class], &outCount); for (i = 0; i < outCount; i++) { objc_property_t property = properties[i]; const char *propName = property_getName(property); if (propName) { NSString *propertyName = [NSString stringWithUTF8String:propName]; id propertyValue = [self valueForKey:propertyName]; //set up the filter here if([propertyValue isKindOfClass:[NSNumber class]] && [propertyValue intValue] > 0) { [resultDic setObject:propertyValue forKey:propertyName]; }else if(![propertyValue isKindOfClass:[NSNumber class]] && propertyValue !=nil) { //copy all non-nil variables [resultDic setObject:propertyValue forKey:propertyName]; } } } free(properties); return resultDic; } 

Intento get la list de properties de una class y luego devuelvo un dictionary, ha funcionado. Tal vez puedas probarlo.

Editar: El código anterior no funcionó si usé [class propia] en una subclass, pero sí funcionó cuando reemplazé yo mismo con [Clase de elemento].

Agregué un par de cheques simples: me interesan los numbers mayores que 0 y properties no nulas, como cadenas e imágenes. Tenga en count que si elimino la segunda comprobación de número, el código colocará ceros en el dictionary resultante.

Puede usar dictionaryWithValuesForKeys: y luego eliminar cualquier input igual a cero:

 - (NSMutableDictionary *)itemAsDictionary { NSArray *keyArray = @[@"grade", @"otherProperty" // etc. ]; NSMutableDictionary *itemDictionary = [[self dictionaryWithValuesForKeys:keyArray] mutableCopy]; NSArray *keys = [itemDictionary allKeys]; for(NSString *key in keys) { NSNumber *item = itemDictionary[key]; if(item.doubleValue == 0.0) [itemDictionary removeObjectForKey:key]; } return itemDictionary; }