Estoy tratando de serializar dos NSMutableArrays de NSObjects que implementan la NSCoding protocolo. Sin embargo, lo que funciona para uno (stacks) y el otro no (cards). Tengo el siguiente bloque de código:

-(void) saveCards
{
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString* documentsDirectory = [paths objectAtIndex:0];

    NSString* cardsFile = [documentsDirectory stringByAppendingPathComponent:@"cards.state"];
    NSString* stacksFile = [documentsDirectory stringByAppendingPathComponent:@"stacks.state"];
    BOOL c = [rootStack.cards writeToFile:cardsFile atomically:YES];
    BOOL s = [rootStack.stacks writeToFile:stacksFile atomically:YES];
}

Me paso a través de este método que utiliza el depurador, y después de las dos últimas líneas de código en ejecución, compruebe los valores de los dos BOOLs. BOOL c es NO y BOOL s es YES. El stacks matriz está realmente vacía (que es probablemente la razón por la que funciona). El cards matriz de contenidos. ¿Por qué es que la matriz con contenido está fallando? Yo no puedo entender esto. He mirado a través de numerosos hilos en el SOF, cada uno de ellos dicen que el problema es debido a que el nivel de protección de los archivos que fueron escritos para la prevención de los mismos a partir de la escritura. Este no es mi problema, ya que me dirijo a la carpeta de Documentos. He doble y triple comprobado que ni rootStack.cards ni rootStack.stacks es nula. Y he comprobado que las tarjetas de hecho tiene contenido.

Aquí están los coder métodos para mi Nota de clase (he añadido todos los if instrucciones como parte de un intento de resolver este problema para asegurarse de que tratando de codificar nil valores de no romper algo):

-(void) encodeWithCoder:(NSCoder *)encoder
{
    if(text)
        [encoder encodeObject:text forKey:@"text"];
    if(backText)
        [encoder encodeObject:backText forKey:@"backText"];
    if(x)
        [encoder encodeObject:x forKey:@"x"];
    if(y)
        [encoder encodeObject:y forKey:@"y"];
    if(width)
        [encoder encodeObject:width forKey:@"width"];
    if(height)
        [encoder encodeObject:height forKey:@"height"];
    if(timeCreated)
        [encoder encodeObject:timeCreated forKey:@"timeCreated"];
    if(audioManagerTicket)
        [encoder encodeObject:audioManagerTicket forKey:@"audioManagerTicket"];
    if(backgroundColor)
        [encoder encodeObject:backgroundColor forKey:@"backgroundColor"];
}

-(id) initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if(!self)
        return nil;

    self.text               = [decoder decodeObjectForKey:@"text"];
    self.backText           = [decoder decodeObjectForKey:@"backText"];
    self.x                  = [decoder decodeObjectForKey:@"x"];
    self.y                  = [decoder decodeObjectForKey:@"y"];
    self.width              = [decoder decodeObjectForKey:@"width"];
    self.height             = [decoder decodeObjectForKey:@"height"];
    self.timeCreated        = [decoder decodeObjectForKey:@"timeCreated"];
    self.audioManagerTicket = [decoder decodeObjectForKey:@"audioManagerTicket"];
    self.backgroundColor    = [decoder decodeObjectForKey:@"backgroundColor"];

    return self;
}

cada campo es un NSString, NSNumber, o UIColor.

Gracias por la ayuda

OriginalEl autor Joel | 2010-05-04

2 Comentarios

  1. 14

    Que son confusas las listas de propiedades de archivo. Es fácil de hacer.

    writeToFile:atomically: requiere que el contenido sea de propiedad de la lista de compatibles; es decir, todos los objetos de la matriz de ser una instancia de una de las clases permitidas en las listas de propiedades (diccionarios, cadenas de texto, de datos, matrices, etc…).

    Ver: writeToFile:atómicamente:’s de la documentación.

    Lo que quieres es NSArchiver y, más específicamente, para leer el archivado guía.

    OriginalEl autor bbum

  2. 3

    La writeToFile:atomically: método en NSMutableArray está llamando sólo funciona si todos los elementos de la matriz son de propiedad de la lista de objetos (NSString, NSData, NSArray, o NSDictionary de objetos). Se está haciendo NSPropertyListSerialization. Esta no es la misma que la llave de archivado que se realiza mediante NSKeyedArchiver y la NSCoding protocolo. Ver el Archivos y Serialización de Guía para el Cacao para más detalles.

    El problema aquí es que UIColor no es una lista de propiedades de objeto. No obstante, aplicar la NSCoding protocolo y debe trabajar en un archivo. Intente algo como

    BOOL c  = [NSKeyedArchiver archiveRootObject:rootStack.card
                                          toFile:cardsFile];
    BOOL s  = [NSKeyedArchiver archiveRootObject:rootStack.stacks
                                          toFile:stacksFile];

    OriginalEl autor Jason Jenkins

Dejar respuesta

Please enter your comment!
Please enter your name here