【问题标题】:iOS / Core Data - Best way to return an array from a NSSet relationship?iOS / Core Data - 从 NSSet 关系返回数组的最佳方式?
【发布时间】:2012-12-03 17:07:43
【问题描述】:

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

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

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

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

您对此有何看法?

谢谢

【问题讨论】:

  • 您是否尝试过使用“有序关系”?请参阅“OS X v10.7 和 iOS 5.0 的核心数据发行说明”中的 Managed Objects
  • @MartinR 这可能是解决方案,但我的目标是 iOS 4,所以我不能使用它,但无论如何谢谢

标签: iphone ios ipad core-data nsset


【解决方案1】:

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

这是另一个例子:

How to add properties to NSMutableArray via category extension?

但是

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我创建了一个类别,因为如果我修改实体并需要重新生成 NSManagedObject,我不会丢失我的属性/方法
    • 我不太明白你在这里的意思,但你还有另一种选择。您可以创建一个 ImagesManager 类而不是类别,并要求它提供排序图像并将缓存的排序数组存储在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2023-04-08
    • 2014-02-20
    相关资源
    最近更新 更多