根据第二个数组对 NSManagedObjects 数组进行排序
Posted
技术标签:
【中文标题】根据第二个数组对 NSManagedObjects 数组进行排序【英文标题】:Sort array of NSManagedObjects based on second array 【发布时间】:2016-03-31 21:52:05 【问题描述】:我正在尝试根据与每个数组关联的值对 NSManagedObject
数组进行排序。这些值计算起来很昂贵,所以我想最多计算一次。大多数类似问题的解决方案都涉及构造NSDictionary
,但我的对象不(必然)符合NSCopying
协议。我曾考虑过使用对象 ID,但是否有更清洁/更简单的解决方案?这种方法有什么问题吗?
【问题讨论】:
在你的密钥不符合 NSCopying 的情况下,你可以使用 NSMapTable 或 CFDictionary。或者,也许您可以通过类别将 NSCopying 的一致性添加到您的关键类中。 【参考方案1】:-
在
NSManagedObject
子类中创建一个便捷方法,计算您需要排序的值并将其返回。对其进行编码,使其只计算一次值。
按便捷方法排序。
更新到 OP
你能详细说明你是怎么做 1. 的吗?我应该使用 NSCache 吗?谢谢
你是NSManagedObject
的子类:
@interface MySubclass: NSManagedObject
@property NSString *myCalculatedSortValue;
- (NSString*)calculatedSortValue;
@end
然后你以懒惰的方式实现它:
@implementation MySubclass
- (NSString*)calculatedSortValue
if (myCalculatedSortValue) return myCalculatedSortValue;
//calculate value
return myCalculatedSortValue;
然后你可以按calculatedSortValue
排序,每个生命周期只会计算一次。
注意:这仅在从商店获取NSManagedObject
实例之后起作用。这不会直接对存储起作用,因为所有计算都发生在对象空间中。
【讨论】:
你能详细说明你是怎么做的 1. ?我应该使用 NSCache 吗?关联值可能会随时间变化,是否需要在需要时手动使缓存失效? 感谢您的回答。但这迫使我(除非我弄错了)1. 在我的持久存储中再保存一个属性 2. 处理何时手动重新计算此属性(例如,如果我的计算依赖的某些内容发生了变化) 不,值确实 NOT 被存储。它在对象的每个生命周期中计算一次;正是你所要求的。如果基础值发生变化,您当然需要重新计算它。在任何设计中都无法避免这种情况。 你在寻找答案然后争论?祝你好运! 我不同意。您可以向类的所有实例添加功能,而无需更改代码以在任何地方使用特定的子类。也许这对 NSManagedObject 无关紧要,但总的来说,我认为组合(has-a 关系)比子类化(is-a 关系)更灵活【参考方案2】:我找到了一个非常简单的解决方案来解决我的问题。我可以创建一个字典,其键是我的对象在其数组中的索引,其关联值是那些与对象关联的值。我按值对字典进行排序,然后按照键给定的顺序检索对象。
【讨论】:
以上是关于根据第二个数组对 NSManagedObjects 数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章