1

我在我的 中添加了一个类别NSManagedObject IBCompany,该类别应根据简单的日期比较检索特定时间段,这是 IBCompany 的关系之一。

当我运行以下代码时, NSArraysortedFinPeriodsDesc以正确的排序顺序包含故障期间。但是,当在for each循环中访问它们时,每个句点的属性都返回 nil,特别是 EndDate 的返回 nil。出于这个原因,我的方法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
  • 在您看来,最好的选择是什么?

非常感谢您的帮助!

4

1 回答 1

1

“延迟加载”带有过早优化的味道。特别是您实现它的方式,您实际上并没有使用实例变量,而是使用全局变量(有关详细信息,请参见此处),这意味着每个对象都没有拥有自己的数组版本。

我建议将数组放在本地并在每次需要时生成它。如果这会影响性能,您可以查看其他方法,但即使上面的 ivar 问题已解决,如果周期集更新,您也会遇到问题 - 您的数组现在已过时。

你还没有说这段时间你的对象被问了多少次,或者有多少对象,或者多少个周期,所以很难给出更具体的建议。

获取的财产可能是获得期限的更有效方式,但我没有足够的经验来帮助您解决具体情况。

于 2012-07-24T12:24:05.050 回答