Question

J'encode généralement mes données dans un NSFileWrapper comme ceci (je laisse de côté le bit NSFileWrapper) :

-(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;
        }
    }

Et je récupère généralement mes données en faisant ceci :

- (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"];

}

Parfois, je reçois NSData retour (ce n'est pas nul), mais [unarchiver decodeObjectForKey:@"data"] renverra NIL.Il semble qu'il n'y ait pas d'objet pour la clé @"data" même s'il devrait y en avoir.Je suppose que quelque chose s'est mal passé lors de l'encodage, mais je ne sais pas comment résoudre ce problème.Puis-je juste prendre tout ce qu'il y a dedans data et l'encoder, sans vous soucier de savoir s'il a la bonne clé ?Je veux dire qu'il ne devrait y avoir qu'une seule "donnée" clé.

Était-ce utile?

La solution

Pourquoi votre code est-il si compliqué :) Le NSKeyedArchiver class a des méthodes d'assistance qui feront ce que vous voulez plus simplement :

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

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top