0

这是我的缝。假设我有公司和员工对象类型,公司有很多员工。我为公司创建一个类别并添加一个方法

-(Employee *)getNextEmployee {
    return (Employee *)self.employees[self.currentEmployeeIndex++];
}

我意识到我无法通过索引访问 NSSet,但由于它是一个类别,我也无法添加 NSArray 实例变量。此方法被频繁调用,因此为每个调用创建一个 NSArray 效率非常低。

同样,请忽略这里的细节,这只是一个例子。

4

3 回答 3

2

编辑:划掉我之前的回答,建议使用 NSSet 的 allObjects 属性。考虑到它让我意识到 allObjects 不能保证每次都以相同的顺序返回数组。

相反,我建议您使用链接列表。为您的 Employee 类创建一个 previousEmployee 属性,并且每次您创建一个新的 Employee 时,使用一些您分配前一个员工的逻辑。它可以基于入境日期:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
request.fetchLimit = 1;

NSSortedDescriptor *sortDescriptor = [sortDescriptorWithKey:@"entryDate" ascending:NO];

// Do further setup...

Employee *latestEmployee = // fetch result...

Employee *newEmployee = // create new employee

newEmployee.previousEmployee = latestEmployee;
于 2013-03-29T05:01:51.017 回答
1

如果您想订购(由 next 暗示),则没有办法绕过数组。经济地拥有数组的方法是创建一个 NSManagedObject 子类并向其添加数组属性。当您从集合中添加/删除时更新它。

于 2013-03-29T05:08:05.157 回答
0

@danh 和 @pedro.m 都给出了很好的答案。我结束了两者的混合。我创建了一个新类来管理我的流程而不是子类,并且我直接从公司的关系属性中提取了员工。像这样的东西:

@implementation CompanyProcessRunner

-(void)setCompany:(Company *)newCompany
{
    company = newCompany;
    employees = [company.employees sortedArrayUsingDescriptors:[NSSortDescriptor descriptorWithKey:@"order" ascending:YES]];
}

-(Employee *)nextEmployee
{
    company.currentEmployeeIndex += 1;
    return (Employee *)[employees objectAtIndex:company.currentEmployeeIndex];
}

@end

感谢大家的帮助!

于 2013-03-30T06:53:25.123 回答