XCode / IOS: NSCoding - persistenza del grafico oggetto con due array di oggetti comuni
Domanda
Ho due classi che assomigliano a questo barebone formano:
@interface GraphNode {
NSMutableArray *edges;
}
@implementation GraphNode
-(id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
edges = [coder decodeObjectForKey:@"edges"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)coder {
[coder encodeObject:edges forKey:@"edges"];
}
@end
@interface GraphEdges {
NSMutableArray *edges;
}
@implementation GraphEdges
-(id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
edges = [coder decodeObjectForKey:@"edges"];
}
return self;
}
-(void)encodeWithCoder:(NSCoder*)coder {
[coder encodeObject:edges forKey:@"edges"];
}
@end
Si noterà che sembrano esprimere lo stesso comportamento - la codifica / decodifica di un NSMutableArray i cui contenuti sono oggetti di un tipo che implementa GraphEdge NSCoding. La differenza tra le classi, in pratica, è che GraphEdges crea bordi nella sua proprietà edges
, mentre GraphNode aggiunge al proprio edges
solo riferimenti alle istanze GraphEdge già esistenti in GraphEdges.edges.
Il mio problema è che quando si decodifica GraphNode e GraphEdges oggetti l'oggetto grafico non viene mantenuta in quanto ogni classe crea le proprie versioni dell'originale GraphEdge oggetti memorizzati nella proprietà edges
per ogni classe.
è tentato di eseguire un'encodeConditionalObject sull'intera NSMutableArray * bordi in GraphNode mantenendo la codifica in GraphEdges incondizionata, ma non sorprende questo semplicemente non riesce a GraphNode.edges codificare come la condizione è posto sulla matrice stessa, non suoi oggetti.
E 'la soluzione per scorrere le matrici in entrambi i casi, ed eseguire la codifica subordinata ogni membro edges
per GraphNode ma la codifica incondizionato per ogni membro della edges
in GraphEdges?
Ogni consiglio è apprezzato, molte grazie.
Soluzione
Credo che il problema qui è che si sta archiviando GraphNode e GraphEdges oggetti separatamente. Unire tutti i relativi GraphNode e GraphEdges oggetti in una sorta di contenitore, forse 'Graph', in modo che essi diventano tutti parte dello stesso oggetto grafico. Credo che NSKeyedArchiver poi archiviare ogni oggetto una sola volta.