ios - query - ¿Es posible anular getters y setters para propiedades @dynamic en una subclase NSManagedObject?
swift 4 core data relationships (1)
Entonces, mi escenario es este:
Tengo una subclase NSManagedObject en mi aplicación iOS, y como propiedad quiero almacenar el contenido de un objeto MKPolygon. La forma en que he decidido hacer esto (y si es válida es quizás una pregunta diferente) es declarar la propiedad del polígono como un objeto transformable, luego almacenar un NSArray que contenga los puntos del polígono (como un objeto NSValue).
Con este fin, he escrito un par de métodos de clases de conveniencia en mi objeto modelo:
+ (NSArray *)coordsArrayFromMKPolygon:(MKPolygon *)polygon pointCount:(int)count
{
CLLocationCoordinate2D *coords = (CLLocationCoordinate2D *)malloc(sizeof(CLLocationCoordinate2D) * count);
[polygon getCoordinates:coords range:NSMakeRange(0, count)];
NSMutableArray *coordsArray = [NSMutableArray array];
for (int i = 0; i < count; i++) {
NSValue *coordVal = [NSValue valueWithBytes:&coords[i] objCType:@encode(CLLocationCoordinate2D)];
[coordsArray addObject:coordVal];
}
free(coords);
return [NSArray arrayWithArray:coordsArray];
}
+ (MKPolygon *)polygonFromCoordsArray:(NSArray *)coordsArray pointCount:(int)count
{
CLLocationCoordinate2D *coords = (CLLocationCoordinate2D *)malloc(sizeof(CLLocationCoordinate2D) * count);
for (int i = 0; i < count; i++) {
CLLocationCoordinate2D coord;
[[coordsArray objectAtIndex:i] getValue:&coord];
coords[i] = coord;
}
free(coords);
return [MKPolygon polygonWithCoordinates:coords count:count];
}
Puedo llamar estos métodos a mis objetos MKPolygon antes de guardar o cargar una instancia del modelo, pero me gustaría reemplazar los getters dinámicos y los setters en el modelo en sí, para poder decir algo como [turf setTurf_bounds:polygon]
(donde el polígono es una instancia MKPolygon).
Lo que realmente me gustaría es poder hacer algo como esto:
- (void)setTurf_bounds:(id)turf_bounds
{
MKPolygon *poly = (MKPolygon *)turf_bounds;
NSArray *coordsArray = [Turf coordsArrayFromMKPolygon:poly pointCount:[poly pointCount]];
// Save the converted value into the @dynamic turf_bounds property
}
- (id)turf_bounds
{
// grab the contents of the @dynamic turf_bounds property into say, NSArray *coordsArray
return [Turf polygonFromCoordsArray:coordsArray pointCount:[coordsArray count]];
}
Pero no he tenido alegría hasta ahora. Llamar a [super setValue:coordsArray forKey:@"turf_bounds"]
o su contraparte getter no funciona, ni intenta escribirlo como self.turf_bounds (que solo llama recursivamente a mis setters anulados).
¿Voy por este camino completamente equivocado, o simplemente me estoy perdiendo algo?
Nunca llame [super valueForKey: ..] en una subclase NSManagedObject! (a menos que los haya implementado usted mismo en una superclase) En su lugar, utilice los métodos primitivos de acceso.
Implementación getter / setter de ejemplo de ADC :
@interface Department : NSManagedObject
@property(nonatomic, strong) NSString *name;
@end
@interface Department (PrimitiveAccessors)
- (NSString *)primitiveName;
- (void)setPrimitiveName:(NSString *)newName;
@end
@implementation Department
@dynamic name;
- (NSString *)name
{
[self willAccessValueForKey:@"name"];
NSString *myName = [self primitiveName];
[self didAccessValueForKey:@"name"];
return myName;
}
- (void)setName:(NSString *)newName
{
[self willChangeValueForKey:@"name"];
[self setPrimitiveName:newName];
[self didChangeValueForKey:@"name"];
}
@end