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

时间:2012-07-05 19:53:13

标签: objective-c ios core-data ios5 nsmanagedobject

我想将自定义计算方法添加到托管对象(根据此对象的其他属性计算某个日期)。

我不确定将其编码为瞬态属性或将类别中的属性添加到此托管对象是否更好。

您怎么看?

这是我目前的代码(类别):

·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

2 个答案:

答案 0 :(得分:2)

你的解决方案似乎很好。如果你使用了瞬态属性,你仍然需要代码来计算它的值,所以无论如何你都需要一个类别。

如果你经常访问它的值,我想有一个瞬态属性会更有意义,在这种情况下,你想要缓存它的值。如果您只想访问该值几次,则无需这样做。

答案 1 :(得分:1)

一个类别提供的只读属性很简单 - 远远不够。并没有弄脏那个对象模型。

但是,对于用户来说,瞬态属性方法是性感的,因为派生属性是自动更新的。 它有点像这样......

@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