Xcode/iOS: nscoding - persistencia del gráfico de objetos con dos matrices de objetos comunes
Pregunta
Tengo dos clases que se ven así en forma básica:
@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
Notará que parecen expresar el mismo comportamiento: codificar/decodificar una nsmutableArray cuyo contenido son objetos de un tipo de gráfico que implementa Nscoding. La diferencia entre las clases en la práctica es que Graphedges crea bordes en su edges
propiedad, mientras que Graphnode se suma a la suya edges
Solo referencias a instancias de Graphedge ya existentes en Graphedges.edges.
Mi problema es que al decodificar los objetos de Graphnode y Graphedges, el gráfico de objetos no se mantiene ya que cada clase crea sus propias versiones de los objetos de Graphedge originales almacenados en el edges
propiedad para cada clase.
Traté de hacer un colector de código de codificación en los bordes nsmutableArray *en grafnode mientras mantengo la encuesta en gráficos incondicionales, pero, como era de esperar, esto simplemente no puede codificar grafnode.edges a medida que la condición se coloca en la matriz en sí, no en sus objetos.
Es la solución para iterar a través de las matrices en ambos casos y realizar una codificación condicional en cada edges
miembro para grafnode pero codificación incondicional para cada miembro de edges
en gráficos?
Se agradece cualquier consejo, muchas gracias.
Solución
Creo que el problema aquí es que estás archivando los objetos de Graphnode y Graphedges por separado. Combine todos los objetos de gráficos y gráficos relacionados en algún tipo de contenedor, tal vez 'gráfico', para que todos se conviertan en parte del mismo gráfico de objetos. Creo que Nskeyedarchiver archivará cada objeto solo una vez.