Objective c 核心数据:使用惰性实例化时奇怪的错误行为

Objective c 核心数据:使用惰性实例化时奇怪的错误行为,objective-c,ios,ios5,core-data,nsmanagedobject,Objective C,Ios,Ios5,Core Data,Nsmanagedobject,我已将一个类别添加到我的NSManagedObject IBCompany,该类别应根据简单的日期比较检索特定的时间段,这是IBCompany的关系之一 当我运行以下代码时,NSArraysortedInputPerioddesc以正确的排序顺序包含故障时段。但是,当在每个循环的中访问它们时,每个时段的属性都返回nil,尤其是结束日期返回nil。因此,我的方法lastReportedPeriodforDate总是返回nil,这是一个错误 #import "IBCompany+FinstatAcc

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

当我运行以下代码时,NSArray
sortedInputPerioddesc
以正确的排序顺序包含故障时段。但是,当在每个循环的
中访问它们时,每个时段的属性都返回nil,尤其是结束日期返回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;
}
#导入“IBCompany+FinstatAccessors.h”
@实施公司(FinstatAccessors)
NSArray*分拣周期描述;
-(IBFinPeriod*)上次报告的PeriodForDate:(NSDate*)日期;
{
如果(!SortedInputPeriodDescrc){
NSSortDescriptor*sortDescriptor=[NSSortDescriptor sortDescriptor with key:@“EndDate”升序:否];
SortedInputPeriodDescriptor=[self.finperiod SortedArray使用描述符:[NSArray Array WithObject:sortDescriptor]];
}   
IBFinPeriod*最后一个期间;
用于(IBFinPeriod*SortedInputPeriodDescrc中的finPeriod){
如果([finPeriod.EndDate比较:日期]==传感器终止搜索){//finPeriod.EndDate<日期
lastPeriod=finPeriod;
打破
}
}
重现期;
}
但是,当通过删除
if子句
并始终实例化和排序NSArray
sortedInputPeriodDESC
来替换方法中的第一行(延迟实例化)时,代码工作正常

因此,我有几个问题:

  • 我的代码中有什么错误?如何影响延迟实例化 断层
  • 您是否建议将NSArray
    sortedInputPeriodsdesc
    定义为瞬态属性,并在
    awakeFromFetch
    中将其排序
  • 你认为最好的选择是什么
非常感谢你的帮助

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

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

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

A可能是获得月经周期的更有效的方法,但我没有足够的经验来帮助你解决具体的问题

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

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

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


A可能是获得月经周期的更有效的方法,但我没有足够的经验来帮助你解决具体的问题

将数组中的NSManagedObject转换为类IBFinPeriod..可能会有问题。。?还要仔细检查awakefrominsert等等。在实现部分,数组真的定义了“浮动”吗?Vaibhav,我还没有使用awakefrominsert。我只使用上面问题中提供的代码。Jrturton,你说的“四处浮动”是什么意思?我的意思是,你只是把它写在一行上,而不是放在括号内,通常在括号内声明IVAR?这是我让它工作的唯一方法。如果我把它放在接口声明
@interface-IBCompany(FinstatAccessors){@private-NSArray*sortedFinPeriodsDesc,*sortedFinPeriodsAsc;}
中,我会得到一条错误消息
ivar可能不在类别中
。将数组中的NSManagedObject转换为类IBFinPeriod可能是个问题。。?还要仔细检查awakefrominsert等等。在实现部分,数组真的定义了“浮动”吗?Vaibhav,我还没有使用awakefrominsert。我只使用上面问题中提供的代码。Jrturton,你说的“四处浮动”是什么意思?我的意思是,你只是把它写在一行上,而不是放在括号内,通常在括号内声明IVAR?这是我让它工作的唯一方法。如果我把它放在接口声明
@interface IBCompany(FinstatAccessors){@private NSArray*sortedFinPeriodsDesc,*sortedFinPeriodsAsc;}
中,我会得到错误消息
IVAR可能不在类别中