2012-07-31 5 views
0

Éditer (2012/10/22): Reformuler cette question dans des termes, espérons-le, plus clairs. Essentiellement, ce que je cherche est un NSCoder qui peut (un) archiver entre plusieurs emplacements. Certaines des primitives d'objets codés doivent être enregistrés dans l'emplacement A tandis que d'autres doivent être enregistrés dans l'emplacement spécifié B, etc.Diviser les données pour NSKeyedArchiver et NSKeyedUnarchiver

Par exemple, supposons que nous avons une classe avec quelque chose comme ceci:

@interface SomeClass 
{ 
    NSString *ivar1; 
    NSString *ivar2; 
    NSString *ivar3; 

    SomeClass *ivarZ; 
} 

... 

@end 

Quelque part, nous ont une instance:

SomeClass *someObject; 

Ce que je veux faire quelque chose comme ce qui suit sur l'enregistrement:

NSData *prefDat = [KeyedMultiArchiver archiveRootObject:someObject 
             withPartitionKey:@"DataForNSUserDefaults"]; 
NSData *permDat = [KeyedMultiArchiver archiveRootObject:someObject 
             withPartitionKey:@"DataForPermanentStorage"]; 
/* save prefDat to NSUserDefaults */; 
/* save permDat to some appropriate NSURL */; 

Et puis désarchivage:

SomeClass *anotherObject = [SomeClass new]; 

NSData *prefDat = /* get from NSUserDefaults */; 
NSData *permDat = /* get from appropriate NSURL */; 

[KeyedMultiUnarchiver unarchiveData:prefDat 
         intoObject:anotherObject 
        withPartitionKey:@"DataForNSUserDefaults"]; 

[KeyedMultiUnarchiver unarchiveData:permDat 
         intoObject:anotherObject 
        withPartitionKey:@"DataForPermanentStorage"]; 

ivar1 s pourraient être sauvés à NSUserDefaults et ivar2 s, ivar3 s sur le disque quelque part.

Je vais probablement finir par coder ma propre solution pour cela, mais si vous venez avec des alternatives brillantes, faites-le moi savoir!

Va poster le produit final.

+0

Je pense que vous devez fournir un peu plus de détails sur votre structure. Est-ce un dict de haut niveau avec des données mutables et des données immuables en dessous, ou les données mutables sont-elles dispersées autour de votre structure de données immuable? –

+0

Il y a au moins 3 niveaux de profondeur. Chaque objet de chaque couche peut avoir une ou plusieurs des données immuables et mutables. Du point de vue global, il n'y a pas de division systématique entre les propriétés mutables et immuables; chaque classe de la hiérarchie décide pour elle-même. J'espère que la logique de sérialisation des données sera centralisée autant que possible - je préférerais garder les classes individuelles en train d'enregistrer et de charger leurs données individuelles ou quoi que ce soit de ce genre. – Ncat

+0

Malheureusement, juste après avoir posté cette question, le projet a été temporairement arrêté, donc je n'ai pas pu le résoudre pour le moment. Cependant, une solution (désespérée) que je pensais était de réécrire le code de sérialisation pour utiliser les données de base à la place. J'espère vraiment éviter cela, donc toutes les suggestions sont très appréciées. – Ncat

Répondre

0

Eh bien, voici la solution que je fini par venir avec:

https://github.com/xelxebar/BWPartitioning

lieu de sous-classement NSCoder, cela est purement un cadre personnalisé. Le référentiel ci-dessus est un projet XCode et devrait fonctionner juste hors de la boîte. Les commentaires sont clairsemés et très alpha, mais il y a un peu d'explication sur le modèle d'utilisation prévu.

N'hésitez pas à utiliser ceci, mais vous pouvez et/ou poser des questions. La rétroaction est appréciée.

À la votre!

Questions connexes