Можно ли переопределить геттеры и сеттеры для @dynamic properties в подклассе NSManagedObject?
Итак, мой сценарий таков:
у меня есть подкласс NSManagedObject в моем приложении iOS, и в качестве свойства я хочу сохранить содержимое объекта MKPolygon. Способ, которым я решил это сделать (и действительно ли это, возможно, другой вопрос), - объявить свойство polygon как преобразуемый объект, а затем сохранить 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 перед сохранением или загрузкой экземпляра модели, но я хотел бы переопределить динамические геттеры и сеттеры в самой модели, чтобы я мог просто сказать что-то вроде [turf setTurf_bounds:polygon]
(где 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"]
или ее добытчик двойник не работает, и не пытается написать его как себя.turf_bounds (который просто рекурсивно вызывает мои переопределенные сеттеры).
Я иду по этому совершенно неправильному пути или просто что-то упускаю?
1 ответов
никогда не вызывайте [super valueForKey:.. в NSManagedObject подкласс! (если вы сами не реализовали их в суперклассе) Вместо этого используйте примитивные методы доступа.
пример реализации геттера / сеттера из 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