39 votes

Est-il possible de remplacer les getters et les setters pour les propriétés @dynamic dans une sous-classe NSManagedObject?

Donc, mon scénario est le suivant:

J'ai un NSManagedObject sous-classe dans mon application iOS, et bien je veux stocker le contenu d'un MKPolygon objet. Le moyen que j'ai décidé d'aller à ce sujet (et si c'est valable, c'est peut-être une autre question) est de déclarer le polygone de la propriété comme un transformables objet, puis de stocker un NSArray contenant le polygone de points (comme une NSValue objet).

À cette fin, j'ai écrit un couple de commodité méthodes de la classe sur mon modèle d'objet:

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

Je peux juste appeler ces méthodes sur mon MKPolygon les objets avant de les enregistrer ou de charger une instance du modèle, mais j'aimerais remplacer la dynamique des getters et setters dans le modèle lui-même, de sorte que je peux juste dire quelque chose comme [turf setTurf_bounds:polygon] (lorsque le polygone est un MKPolygon exemple).

Ce que j'aimerais vraiment c'est d'être capable de faire quelque chose comme ceci:

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

Mais je n'ai pas eu la joie jusqu'à présent. Appelant [super setValue:coordsArray forKey:@"turf_bounds"] ou de ses getter contrepartie ne fonctionne pas, ni ne tente de l'écrire comme soi-même.turf_bounds (qui vient de manière récursive appelle mon substituée setters).

Vais-je à propos de cette complètement le mauvais chemin, ou tout simplement manque quelque chose?

76voto

Martin Brugger Points 2733

N'appelez jamais [super valueForKey: ..] dans une sous-classe NSManagedObject! (sauf si vous les avez implémentées vous-même dans une super-classe) Utilisez plutôt les méthodes d'accès primitif.

Exemple d'implémentation d'accesseur en lecture / écriture à partir d' 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X