Anulación de sets con properties dinámicas y de arco.

Necesito hacer algunas cosas adicionales en un método setter. Pero obtengo un bucle infinito al hacerlo:

Tengo un object de datos central

@interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @dynamic date; -(void)setDate:(NSDate *)date { self.date = date; //additional stuff omitted } 

Entonces, en ese caso obtengo un ciclo infinito. Está bien, así que busqué en la networking y modifiqué mi código de la siguiente manera y para cada versión obtengo errores de compilation

Versión 1:

 @interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @dynamic date; -(void)setDate:(NSDate *)date { self->date = date; //Error: Property 'date' found on object 'Transaction *'; did you mean to access it with the "." operator? //additional stuff omitted } 

Versión 2:

 @interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @dynamic date = _date; //Error: Expected ';' after @dynamic -(void)setDate:(NSDate *)date { _date = date; //additional stuff omitted } 

Ahora, me pregunto cómo hacer esto.

    La solución a mi problema:

     @interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @dynamic date; -(void)setDate:(NSDate *)date { [self setPrimitiveValue:date forKey:@"date"]; //additional stuff omitted } 

    ¿Hay una "date" respaldada por un atributo correspondiente en Datos básicos?

    Si es así, eche un vistazo a los methods Custom setter en Core-Data

    Si no es así, y no es necesario que persista "date", su código debería ser el siguiente:

     @interface Transaction : NSManagedObject @property (nonatomic, retain) NSDate * date; @end @implementation Transaction @synthesize date = _date; -(void)setDate:(NSDate *)date { _date = date; //additional stuff omitted } 

    Aquí está la nueva forma de anular las properties de NSManagedObject sin romper KVO, en su .m:

     @interface Transaction(DynamicAccessors) - (void)managedObjectOriginal_setDate:(NSDate *)date; @end @implementation Transaction @dynamic date; - (void)setDate:(NSDate *)date { // invoke the dynamic implementation of setDate [self managedObjectOriginal_setDate:(NSString *)date; // your custom code } 

    Como se ve en la parte inferior de esta página Novedades de Core Data en macOS 10.12, iOS 10.0, TVOS 10.0 y watchOS 3.0