何时向托管对象添加类别以及何时使用瞬态属性?
Posted
技术标签:
【中文标题】何时向托管对象添加类别以及何时使用瞬态属性?【英文标题】:When to add an category to a managed object and when to use transient attributes? 【发布时间】:2012-07-05 19:53:12 【问题描述】:我想向托管对象添加自定义计算方法(它根据该对象的其他属性计算某个日期)。
我不确定将其编码为瞬态属性或将类别中的属性添加到此托管对象是否更好。
你怎么看?
这是我当前的代码(类别):
.h:
@interface IBFinPeriod (DateCalculations)
@property (readonly) NSDate* periodBeginDate;
@end
.m:
#import "IBFinPeriod+DateCalculations.h"
@implementation IBFinPeriod (DateCalculations)
- (NSDate*)periodBeginDate
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
if ([self.incPeriodTypeCode isEqualToString:@"M"])
offsetComponents.month = - [self.incPeriodLength intValue];
else if ([self.incPeriodTypeCode isEqualToString:@"W"])
offsetComponents.week = - [self.incPeriodLength intValue];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *beginDate = [calendar dateByAddingComponents:offsetComponents toDate:self.EndDate options:0];
return beginDate;
@end
【问题讨论】:
【参考方案1】:您的解决方案似乎很好。如果您使用瞬态属性,您仍然需要代码来计算其值,因此无论如何您都需要一个类别。
我想如果你经常访问它的值,那么拥有一个瞬态属性会更有意义,在这种情况下你会想要缓存它的值。如果您只打算访问该值几次,则无需这样做。
【讨论】:
+1 如果您想要缓存,建议只使用临时。但是要知道,一旦缓存了值,您必须显式更改它或发送 -refreshObject:mergeChanges: 以再次计算它。因此,您必须进行键值观察并设置瞬态值,而不是动态计算属性本身。【参考方案2】:为类别提供的只读属性很简单——从长远来看。并且不会弄脏那个对象模型。
但是瞬态属性方法对用户来说很有吸引力,因为派生属性会自动更新。 它有点像这样......
@implementation IBFinPeriod (IBFinPeriod_Observations)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
if ([@"incPeriodTypeCode" isEqualToString: keyPath] )
[self updatePeriodBeginDate];
else
[super observeValueForKeyPath: keyPath ofObject:object change:change context:context];
- (void)updatePeriodBeginDate
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
if ([self.incPeriodTypeCode isEqualToString:@"M"])
offsetComponents.month = - [self.incPeriodLength intValue];
else if ([self.incPeriodTypeCode isEqualToString:@"W"])
offsetComponents.week = - [self.incPeriodLength intValue];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *beginDate = [calendar dateByAddingComponents:offsetComponents toDate:self.EndDate options:0];
// NOW SET THE TRANSIENT PROPERTY HERE
[self setPeriodBeginDate: beginDate];
// return beginDate; // NOt returning anymore
@end
【讨论】:
以上是关于何时向托管对象添加类别以及何时使用瞬态属性?的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 GetXXX() 方法以及何时使用 Getter 属性