Разделить данные для NSKeyedArchiver и NSKeyedUnarchiver

Изменить (2012/10/22): перефразируя этот вопрос, надеюсь, в более ясных терминах.

По сути, я ищу какой-нибудь NSCoder, который может (не)архивировать между несколькими местоположениями. Некоторые примитивы закодированных объектов должны быть сохранены в местоположении A, а другие — в указанном местоположении B и т. д.

Например, предположим, что у нас есть класс с чем-то вроде этого:

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

   SomeClass *ivarZ;
}

...

@end

Где-то у нас есть экземпляр:

SomeClass *someObject;

То, что я хочу сделать, это что-то вроде следующего при сохранении:

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

И затем при разархивировании:

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

Где ivar1s могут быть сохранены в NSUserDefaults и ivar2s, ivar3s где-то на диске.

Я, вероятно, в конечном итоге напишу свое собственное решение для этого, но если вы, ребята, придумаете какие-либо блестящие альтернативы, пожалуйста, дайте мне знать!

Выложу конечный продукт.


person Ncat    schedule 31.07.2012    source источник
comment
Я думаю, вам нужно предоставить немного больше деталей о вашей структуре. Это верхний уровень dict с изменяемыми данными и неизменяемыми данными под ним, или изменяемые данные разбросаны по вашей неизменяемой структуре данных?   -  person Gordon Dove    schedule 31.07.2012
comment
Глубина минимум 3 уровня. Каждый объект в каждом слое может иметь одно или оба неизменяемых и изменяемых данных. С глобальной точки зрения нет систематического разделения между изменяемыми и неизменяемыми свойствами; каждый класс в иерархии решает сам. Я надеюсь, что логика сериализации данных будет максимально централизована - я бы предпочел, чтобы отдельные классы сохраняли и загружали свои индивидуальные данные или что-то в этом роде.   -  person Ncat    schedule 31.07.2012
comment
К сожалению, сразу после публикации этого вопроса проект был временно остановлен, поэтому я пока не смог это исправить. Однако одно (отчаянное) решение, о котором я подумал, состояло в том, чтобы переписать код сериализации, чтобы вместо этого использовать Core Data. Я действительно надеюсь избежать этого, поэтому любые предложения очень ценятся.   -  person Ncat    schedule 06.08.2012
comment
Этот проект только что был перезапущен. Причина такого поведения заключается в том, что некоторые переменные в моих объектах должны изменяться нечасто, в то время как другие не будут меняться вообще после загрузки.   -  person Ncat    schedule 22.10.2012


Ответы (1)


Ну, вот решение, которое я в итоге придумал:

https://github.com/xelxebar/BWPartitioning

Вместо того, чтобы создавать подклассы NSCOder, это чисто пользовательский фреймворк. Приведенный выше репозиторий является проектом XCode и должен запускаться прямо из коробки. Комментарии скудны, и это очень альфа-версия, но есть небольшое объяснение предполагаемого шаблона использования.

Не стесняйтесь использовать это, как можете, и/или задавайте любые вопросы. Обратная связь приветствуется.

Ваше здоровье!

person Ncat    schedule 02.11.2012