【问题标题】:Can SectionNameKeyPath category method of NSManagedObject subclass take an argument?NSManagedObject 子类的 SectionNameKeyPath 类别方法可以带参数吗?
【发布时间】:2014-01-24 19:11:11
【问题描述】:

我正在实施这个 SO 帖子 Custom Core Data SectionNameKeyPath:特别是 Martin R 的第一个建议,即添加一个类别方法来提供我的 sectionNameKeyPath

在那里,他们有一个名为 acctPeriod 的持久属性用于排序描述符,还有一个名为 periodYear 的类别方法,它适用于 acctPeriod(准确地说,提取其前 4 个字符)。但是,我有许多持久属性,例如 acctPeriod,用户可以为排序描述符选择其中的任何一个,并且我想在它们上实现相同的方法以作为sectionNameKeyPath 提供数据。换句话说,我想将 acctPeriod 作为参数传递给 category 方法,例如 periodYear:(NSString*) acctPeriod

这可能吗?这种类别方法和 FRC (sectionNameKeyPath) 的代码看起来如何?

谢谢!

【问题讨论】:

  • 是什么让你想到,类别方法不能接受参数?你为什么不试试呢?
  • 我特别指的是一个类别方法用作 sectionNameKeyPath。 (我已经编辑了我的问题标题,以便更清楚。)

标签: ios objective-c core-data nsfetchedresultscontroller


【解决方案1】:

“部分名称键路径”是应用于每个托管对象的键路径 并返回部分名称,即 获取结果控制器调用 [object valueForKeyPath:<sectionNameKeyPath>]为每个对象划分表格时 分段。

如果关键路径被实现为(类别)方法,它必须是 一个方法没有参数,只使用隐式参数self。 因此,我看不到附加参数如何 在该方法中使用(除非您使用一些全局变量)。

但如果创建节名的方法完全相同 可能的属性(例如在链接示例中获取字符串的前四个字符),您可以将该方法实现为NSString 上的类别:

@interface NSString (MyAdditions)
- (NSString *)firstFourCharacters;
@end

@implementation NSString (MyAdditions)
- (NSString *) firstFourCharacters {
    if ([self length] <= 4)
        return self;
    return [self substringToIndex:4];
}
@end

然后你动态地创建一个&lt;yourAttribute&gt;.firstFourCharacters 形式的部分名称键路径

sectionNameKeyPath:[NSString stringWithFormat:@"%@.firstFourCharacters", yourAttribute]

在获取的结果控制器中,其中yourAttribute 是持久属性 当前用于对表格视图进行排序。

键值编码机制将 (对于每个托管对象)首先将&lt;yourAttribute&gt; 应用于对象,然后将firstFourCharacters 应用于结果。

【讨论】:

  • 谢谢,我去试试。另外,我不知道点语法也适用于方法(而不仅仅是属性)。
  • 我对另一点有点困惑。在链接的示例中(我没有足够的代表发表评论),是否不需要将访问持久属性的行夹在中间,例如 willAccessValueForKey:@"acctPeriod" 和 didAccessValueForKey:@"acctPeriod"?还是只有在我们为建模属性编写自定义 getter/setter 时才需要这样做?
  • @JSreedhar:在链接示例中,sectionNameKeyPath 只是一个访问self.acctPeriod 的方法。 - 如果您将部分名称键路径实现为 transient 属性(如答案末尾的建议),您将需要 will/didAccessValueForKey 和原始访问器以避免无限递归。有关示例,请参阅stackoverflow.com/a/20249349/1187415。瞬态属性的优点是为每个对象缓存节名,而不是频繁地重新计算。
  • 谢谢。另一件事,您是否同意 Dan Shelly 反对使用瞬态属性作为 sectionNameKeyPath 的建议 - 他说这将导致故障触发。但是,如果苹果的示例代码使用它,我想它是可以的。
  • @JSreedhar:我没有对此进行调查,因此无法对此发表评论。
【解决方案2】:

正如所指出的,这应该是微不足道的:

@interface Transaction (AdditionalMethods)
-(NSString*)sectionStringForPeriod:(NSNumber*)acctPeriod;
@end

【讨论】:

  • 我正在调用此方法来指定 NSFetchedResultsController 中的 sectionNameKeyPath:,并且我希望它的参数是当前用于对表视图进行排序的持久属性。 @MartinR 说它不能完成,很遗憾。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多