patterns framework español iphone cocoa cocoa-touch serialization cocoa-design-patterns

framework - ¿Cómo serializo un objeto simple en iPhone sdk?



cocoa touch español (3)

Para serializar un objeto personalizado, solo debe cumplir con el protocolo NSCoding . Si su objeto extiende NSObject, todo lo que necesita hacer (creo) es implementar estos (ejemplo para el objeto persona):

// Encode an object for an archive - (void)encodeWithCoder:(NSCoder *)coder { [super encodeWithCoder:coder]; [coder encodeObject:name forKey:@“Name”]; [coder encodeInteger:age forKey:@“Age”]; } // Decode an object from an archive - (id)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; name = [[coder decodeObjectForKey:@“Name”] retain]; age = [coder decodeIntegerForKey:@“Age”]; }

NSArray y NSDictionary ya implementan métodos para la serialización. Serializarán todos los objetos que contienen (si los objetos implementan la interfaz NSCoder, lo hacen si amplían NSObject). CodiceWithCoder e initWithCoder no hacen nada por defecto, así que a menos que implementes tu propio código en tus clases, nada se serializa.

Si tiene NSArray o NSDictionary de objetos, puede sincronizarlos usando:

// Writing - (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag; - (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag; // Reading - (id)initWithContentsOfFile:(NSString *)aPath; - (id)initWithContentsOfURL:(NSURL *)aURL;

Tengo un diccionario de objetos; todos son objetos POCO que deberían ser serializables. ¿Qué técnica debo mirar para escribir esto en el disco? Estoy buscando la opción más simple para escribir algunas listas para guardar el estado.

Creo que tengo 3 opciones.

  1. archivos plist. Sin embargo, esto parece estar limitado a solo almacenar objetos predefinidos (cadenas, números, etc.), no objetos (como una persona con un nombre y edad).

  2. CoreData. (Nuevo en 3.0) Esto funcionaría bien; sin embargo, mi modelo de datos debería cambiar para que esto funcione. Esto sería una repetición masiva y no estoy seguro si vale la pena el esfuerzo.

  3. SQLLite. Implemente una base de datos SQL simple para leer desde y hacia. He hecho la menor cantidad de inversión en esta, pero no quiero tener que ''reescribir'' algunas de las funciones ORM de datos centrales.


NSCoder es el idioma estándar de Cocoa para la serialización.


Haga esto de la misma manera que lo haría en Mac OS X: sus POCO deben cumplir con el protocolo NSCoding . Vea here para una referencia conceptual, y here para la referencia de NSCoding.

Si la información no es tan extensa y no tienes relaciones ridículamente complicadas entre tus objetos, escribir todo como un plist es probablemente tu mejor opción; es muy rápido de ejecutar y simple de implementar en tu código. Como dijo, CoreData probablemente requerirá mucho trabajo adicional para adaptar su código, y sqlite realmente solo sirve para almacenar datos que son perfectos para ser almacenados en una base de datos relacional. Tenga en cuenta que sqlite también es más lento y utiliza más recursos que trabajar con listas binarias.