NSCoding con objects personalizados nesteds?

Tengo una serie de objects nesteds que necesito pasar por el protocolo NSCoding para que pueda save el object de nivel superior en NSUserDefaults.

Aquí está la estructura de los objects:

Clase 'instructor'

  • NSMutableArray que contiene instancias de …

Clase 'class'

  • NSMutableArray que contiene instancias de …

Clase 'estudiante'

  • Nombre de propiedad
  • Propiedad numérica
  • Propiedad del dinero

Necesito save una instancia de Instructor en NSUserDefaults o en documentos para la aplicación. Como puede ver, el object Instructor está sosteniendo una matriz que a continuación retiene instancias de una class. Ese object de class tiene instancias de estudiantes.

¿El protocolo NSCoding es recursivo? ¿Qué quiero decir con eso es que si agrego el protocolo NSCoding a cada class, podría save un object Instructor y codificar recursivamente los objects contenidos?

¿Funcionaría de la misma manera mientras decodificaba? Podría simplemente decodificar la class de instructor y descodificar recursivamente los objects contenidos porque también se ajustan al protocolo NSCoding?

¿Cómo podría configurar esto?

Sí, puede (y probablemente debería) escribir su compatibilidad para que NSCoding sea recursivo. Así se supone que NSCoding funcione.

Cuando su implemento encodeWithCoder, simplemente llame

 [coder encodeObject: aProperty forKey: @"propertyName"]; 

en todas las properties de su object, incluidas sus properties de contenedor.

Luego, asegúrese de que cada object en el gráfico de objects de su object también se ajuste a NSCoding.

Para las properties escalares, puede save el valor escalar utilizando methods NSCoder como encodeInt: forKey:

Para save un object que se ajuste a NSCoding a los valores pnetworkingeterminados del usuario, primero conviértalo a NSData utilizando el método de class NSKeyedArchiver archivedDataWithRootObject, luego guarde los datos resultantes en valores pnetworkingeterminados. Bastante simple, de verdad.

NSCoding no es mágico, por lo que funcionará 'recursivamente' si la implementación de los methods de encoding y deencoding lo indica.

Implementar los methods NSCoding y pasar los datos que se codificarán al codificador. Implemente los methods NSCoding en todas sus classs personalizadas para que cuando codifique la matriz todos los contenidos puedan procesarse adecuadamente.

Asegúrese de llamar super si la superclass de classs también implementa NSCoding .

p.ej

 - (void)encodeWithCoder:(NSCoder *)encoder { [encoder encodeObject:self.arrayOfClasses forKey:@"arrayOfClasses"]; } - (id)initWithCoder:(NSCoder *)decoder { self.arrayOfClasses = [decoder decodeObjectForKey:@"arrayOfClasses"]; }