Pergunta

Eu geralmente codificar os meus dados em um NSFileWrapper como este (eu deixar de fora o NSFileWrapper bits):

-(NSData*)encodeObject:(id<NSCoding>)o {
        @autoreleasepool {            
            NSMutableData *data = [NSMutableData data];
            NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
            [archiver encodeObject:o forKey:@"data"];
            [archiver finishEncoding];
            return data;
        }
    }

E eu costumo ter a minha dados de volta ao fazer isso:

- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {

    NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
    if (!wrapper) {
        NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
        return nil;
    }

    NSData *data = [wrapper regularFileContents];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    NSLog(@"%@", [unarchiver decodeObjectForKey:@"data"]);
    return [unarchiver decodeObjectForKey:@"data"];

}

Às vezes, eu pego NSData de volta (não é nada), mas [unarchiver decodeObjectForKey:@"data"] retornará NIL.Ele aparece como se não há nenhum objeto para a chave @"dados" mesmo que deve ser.Eu acho que algo deve ter saído errado quando a codificação, mas eu não tenho certeza de como resolver problemas deste.Posso tomar apenas o que está no data e codificá-lo, sem se preocupar se ele tem a chave certa?Quero dizer, não deve apenas ser uma tecla de "dados".

Foi útil?

Solução

Qual é o seu código de tão complicado :) O NSKeyedArchiver classe possui métodos auxiliares que vai fazer o que você quer, mais simplesmente :

// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o]; 

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top