Pergunta

Versão 1.0 de uma aplicação tem um modelo de dados, que é guardado / carregada usando as classes NSKeyed (Un) Archiver, como todas as classes modelo aderir ao protocolo NSCoding. Diga o seguinte hierarquia existe:

-> Houses (NSMutableArray)
-> -> House (Custom Object)
-> -> -> Color (3 ints, RGB)
-> -> -> Number of Residents (int)

dizer que existem arquivos legados armazenados na forma de um, mas precisam ser carregados na versão 2.0 do aplicativo para compatibilidade com versões anteriores, usando o seguinte modelo de dados mais recente:

-> Neighborhood (Maintains NSMutableArray, among other properties)
-> -> TownHouse
-> -> -> Color (3 ints, RGB)
-> -> -> Occupants (NSMutableArray)
-> -> (Other types of houses)

Obviamente, alguns dados serão perdidos e deverão ser preenchidos. Por exemplo. um objeto básico "Ocupante" terá de ser criado para cada um dos "número de residentes" que existiam antes. O que eu estou procurando é uma maneira de carregar programaticamente no modelo de dados anterior, especialmente se eu só tenho uma lista das classes / hierarquia, e não a .m / próprios arquivos .h.

Então, o que eu quero fazer é (supondo que eu tenho um arquivo Houses.data, que foi serializado usando a matriz Houses):

NSFile *legacyFile;
Neighborhood *hood = [Neighborhood neighborhoodFromLegacyFile:legacyFile];

Todas as idéias?

Foi útil?

Solução

Eu acho que o truque aqui é usar o setClass: função fornecida pelo NSKeyedUnarchiver: forClassName. Ele permite que você a dizer: "Use classe TownHouse desserializar todas as instâncias da classe House"

Em seguida, é necessário modificar initWithCoder do seu Townhouse: função para decodificar qualquer hierarquia. Você pode fazer isso chamando decodeObject ou decodeObjectForKey: e, em seguida, usando isKindOfClass: para ver que tipo de objeto que você está lidando. Você também pode usar containsValueForKey:. Para verificar se há certas teclas antes de tentar lê-los

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top