cocoa - Custom Setter in NSManagedObject Subclass -
i have entitiy in nsmanagedobject depended on other enititys, after reading documention on depend keys come following within subclass
+ (nsset *)keypathsforvaluesaffectingvalueforkey:(nsstring *)key { nsset *keypaths = [super keypathsforvaluesaffectingvalueforkey:key]; if ([key isequaltostring:@"assetamount"]) { nsarray *affectingkeys = @[@"assetalternativecur", @"assetaltcur", @"assetcurrency"]; keypaths = [keypaths setbyaddingobjectsfromarray:affectingkeys]; } return keypaths; } - (void)setassetamount:(nsdecimalnumber *)assetamount { [self willchangevalueforkey:@"assetamount"]; if ([[self usealternativecur] boolvalue] == yes) { nsdecimalnumber *result; result = [[self assetconversionrate] decimalnumberbymultiplyingby:[self assetalternativecur]]; [self setprimitiveassetamount:result]; } else { [self setprimitiveassetamount:assetamount]; } [self didchangevalueforkey:@"assetamount"]; }
my problem setter "setassetamount" gets called when change "assetamount" value directly, if change values included in keypathsforvaluesaffectingvalueforkey setter not called. going wrong way? expected setter called each time value changes.
if have observers of value of assetamount, or bindings value of assetamount, observers , bindings updated appropriately when values affecting assetamount changed. assetamount getter invoked.
in assetamount getter, can recalculate assetamount want return.
if want calculation every time getter called, you're done.
if want save value of calculation in ivar, have make sure access ivar directly avoid kvo , bindings triggering. (was catch-22)
if not want getter calculating value every time, believe can call assetamount's setter setters other values. wouldn't need valuesaffecting stuff, because you'd calling setter , triggering kvo.
in sense, you'd need keypathsforvaluesaffectingvalueforkey: only if want assetamount getter calculation every time. if want saved in ivar, use setter when other values change.
(also, can implement keypathsforvaluesaffectingassetamount if go route)
Comments
Post a Comment