【问题标题】:Sort array of NSManagedObjects based on second array根据第二个数组对 NSManagedObjects 数组进行排序
【发布时间】:2016-03-31 21:52:05
【问题描述】:

我正在尝试根据与每个数组关联的值对 NSManagedObject 数组进行排序。这些值计算起来很昂贵,所以我想最多计算一次。大多数类似问题的解决方案都涉及构造NSDictionary,但我的对象不(必然)符合NSCopying 协议。我曾考虑过使用对象 ID,但是否有更清洁/更简单的解决方案?这种方法有什么问题吗?

【问题讨论】:

  • 在你的密钥不符合 NSCopying 的情况下,你可以使用 NSMapTable 或 CFDictionary。或者,也许您可​​以通过类别将 NSCopying 的一致性添加到您的关键类中。

标签: ios core-data nsmanagedobject nsmutabledictionary


【解决方案1】:
  1. 在NSManagedObject 子类中创建一个便捷方法,计算您需要排序的值并将其返回。对其进行编码,使其只计算一次值。
  2. 按便捷方法排序。

更新到 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】:

我找到了一个非常简单的解决方案来解决我的问题。我可以创建一个字典,其键是我的对象在其数组中的索引,其关联值是那些与对象关联的值。我按值对字典进行排序,然后按照键给定的顺序检索对象。

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2020-11-19
    • 2022-01-10
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2023-01-31
    相关资源
    最近更新 更多