2012-07-24 27 views
1

我添加了一个类来我NSManagedObject IBCompany,应检索特定的时间段,这是IBCompany的关系之一,基于一个简单的日期比较时。核心数据:奇怪的断裂行为使用延迟实例

当我运行下面的代码中,NSArray的sortedFinPeriodsDesc包含正确的排序顺序发生故障的时间。但是,在for each循环中访问它们时,每个期间的属性返回nil,特别是nil为EndDate。为此,我的方法lastReportedPeriodforDate总是返回nil,这是一个错误。

#import "IBCompany+FinstatAccessors.h" 

@implementation IBCompany (FinstatAccessors) 

NSArray *sortedFinPeriodsDesc; 

- (IBFinPeriod*)lastReportedPeriodforDate:(NSDate*)date; 
{ 
    if (!sortedFinPeriodsDesc) { 
     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"EndDate" ascending:NO]; 
     sortedFinPeriodsDesc = [self.finperiod sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
     } 
    IBFinPeriod *lastPeriod; 
    for (IBFinPeriod *finPeriod in sortedFinPeriodsDesc) { 
     if ([finPeriod.EndDate compare:date] == NSOrderedAscending){ // finPeriod.EndDate < date 
      lastPeriod = finPeriod; 
      break; 
     } 
    } 
    return lastPeriod; 
} 

然而,通过除去if clause和总是实例化和分选的NSArray sortedFinPeriodsDesc替换的方法中的第一线(延迟实例)的情况下,代码工作正常。

因此,我有几个问题

  • 什么是我的代码中的错误?如何影响延迟实例化 错误?
  • 你会推荐定义的NSArray sortedFinPeriodsDesc为瞬态属性和awakeFromFetch代替排序呢?
  • 你认为最好的选择是什么?

非常感谢您的帮助!

+0

可能是将数组中的NSManagedObject转换为IBFinPeriod类的问题。再次检查awakefrominsert等。 – 2012-07-24 09:35:10

+0

该数组是否真的在实现部分中定义为“浮动”? – jrturton 2012-07-24 09:53:13

+0

Vaibhav,我还没有使用awakeFromInsert。我只使用上面提到的问题中提供的代码。 Jrturton,你是什么意思“漂流”? – AlexR 2012-07-24 12:01:15

回答

1

“延迟加载”会导致过早优化。特别是你实现它的方式,你实际上并没有使用实例变量,而是一个全局变量(详见here),这意味着每个对象都没有保存它自己的数组版本。

我会建议有本地数组,并在每次需要时生成它。如果这会影响性能,您可以查看其他方法,但即使解决了上述伊娃问题,如果设置的时间段已更新,您将遇到问题 - 您的阵列现在已过时。

你还没有说多少次被要求对这一时期你的对象,或多少对象,或者多少时间,所以很难给出更具体的建议。

一个fetched property可能获得一段更有效的方式,但我没有与他们足够的经验,在特定情况下提供帮助。