何时向托管对象添加类别以及何时使用瞬态属性?

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

【讨论】:

以上是关于何时向托管对象添加类别以及何时使用瞬态属性?的主要内容,如果未能解决你的问题,请参考以下文章

如果类别如此强大,那么何时是子类化 iOS 类的合适时机?

何时使用类别而不是对象?

何时以及为何托管 WCF 服务?

何时使用 GetXXX() 方法以及何时使用 Getter 属性

何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?

何时Xcode中CoreData托管对象Optional和Default Value选项会变得尤为敏感?