是否有可能覆盖NSManagedObject子类中的@dynamic属性的getter和setter?

所以,我的情况是这样的:

我在我的iOS应用程序中有一个NSManagedObject子类,作为一个属性,我想存储一个MKPolygon对象的内容。 我决定去做这件事(也许它是有效的也许是一个不同的问题)的方式是声明多边形属性作为一个可变形的对象,然后存储一个NSArray包含多边形的点(作为一个NSValue对象)。

为此,我在模型对象上写了几个方便的类方法:

+ (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]; } 

我可以在保存或加载模型的实例之前在我的MKPolygon对象上调用这些方法,但是我想重写模型中的dynamicgetter和setter,以便我可以像[turf setTurf_bounds:polygon] (其中多边形是一个MKPolygon实例)。

我真正喜欢的是能够做到这样的事情:

 - (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]]; } 

但是迄今为止我没有任何喜悦。 调用[super setValue:coordsArray forKey:@"turf_bounds"]或其getter对手不起作用,也没有试图把它写为self.turf_bounds(它只是recursion调用我重写的setters)。

我是以完全错误的方式去做这件事,还是错过了一些东西?

永远不要在NSManagedObject子类中调用[super valueForKey:..]! (除非你自己在超类中实现它们)而是使用原始的访问器方法。

ADC的 getter / setter实现示例:

 @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