【发布时间】:2012-07-24 09:27:57
【问题描述】:
我已向我的NSManagedObject IBCompany 添加了一个类别,该类别应根据简单的日期比较检索特定时间段,这是 IBCompany 的关系之一。
当我运行以下代码时,NSArray sortedFinPeriodsDesc 以正确的排序顺序包含故障期间。但是,当在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中? - 您认为最好的选择是什么?
非常感谢您的帮助!
【问题讨论】:
-
将数组中的 NSManagedObject 转换为您的类 IBFinPeriod.. 可能是个问题?还要仔细检查 awakefrominsert 等。
-
该数组真的在实现部分定义为“浮动”吗?
-
Vaibhav,我还没有使用 awakeFromInsert。我只使用上面我的问题中提供的代码。 Jrturton,你所说的“飘来飘去”是什么意思?
-
我的意思是,你只是将它单独写在一行上,而不是在通常声明 ivars 的大括号内?
-
这是我让它工作的唯一方法。如果我把它放在接口声明
@interface IBCompany (FinstatAccessors) { @private NSArray *sortedFinPeriodsDesc, *sortedFinPeriodsAsc; }中,我会收到错误消息Ivars may not be placed in categories。
标签: objective-c ios ios5 core-data nsmanagedobject