iOS /核心数据 - 从NSSet关系返回数组的最佳方法?

时间:2012-12-03 17:07:44

标签: iphone ios ipad core-data nsset

我正在创建一个应用程序,我正在使用核心数据存储数据。它工作正常,但我想知道从集合返回排序数组的最佳方法是什么?

例如,我有一个实体A(Button),它包含实体B(Image)的列表。众所周知,核心数据是使用NSSet存储多对多关系。但我想跟踪初始订单,所以我为此目的添加了一个属性“订单”。 问题是在我的代码中我需要在类别文件(按钮+创建)中排序的图像列表我创建了一个像这样的方法:

- (NSArray*)imagesArray
{
    return [self.images sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDeacriptorWithKey:@"order" ascending:YES]]];
}

但是我不认为这是最好的方法,因为如果需要从我的代码中的多个区域(不同的类)访问此列表,那么我需要对x次序进行排序... 有没有办法在我的类别中添加一个数组(属性),以便排序一次然后只检索属性?

您对此有何看法?

由于

2 个答案:

答案 0 :(得分:1)

您可以向类别添加属性: http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/ObjectiveC/Chapters/ocAssociativeReferences.html

这是另一个例子:

How to add properties to NSMutableArray via category extension?

<强>但是

请注意,您将负责观察更改(例如通过KVO)到初始coredata NSSet属性。
因此,如果发生变化,您必须正确“重新计算”您的财产...
如果您的目标是iOS 5.0或更高版本,我建议使用有序集,但由于您不是,我可以想象使用上面链接中描述的方式

答案 1 :(得分:0)

我认为您使用订单属性的方法是正确的。我宁愿在我的模型中创建一个类似于 - (NSArray *)sortedItems的方法,它将具有带有适当排序描述符的NSFetchRequest。如果需要,可以缓存结果 - 将此数组保存在内存中。您的NSManagedObject也可以具有未存储在数据库中的属性,仅存储在内存中。但考虑到Core Data的速度和性能,我真的不认为这是必要的。