如何在NSMangedObject类别中获取多对多NSSet索引的对象

时间:2013-03-29 04:58:10

标签: iphone ios objective-c core-data

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

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

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

同样,请在此处忽略具体细节,这只是一个例子。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

如果你想要订购,那么就没有一个数组了(下一个暗示)。经济地拥有数组的方法是创建NSManagedObject子类并向其添加数组属性。当您从集合中添加/删除时更新它。

答案 2 :(得分: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

感谢大家的帮助!