首页 文章

NSFetchedResultsController - sectionNameForKeypath如何获取其数据?

提问于
浏览
0

我一直在用NSFetchedResultsController做几个噩梦,并试图找到我的问题的解决方案here,我遇到了一些关于fetchedResultsController提取的数据的异常,特别是 sectionNameForKeypath 参数 .

假设我有一个具有2个实体和关系的对象模型,如下所示:

Item << - > Category

Category有一个名为 displayOrder 的(NSNumber *)属性,用于将获取的 Item 实例分隔为表视图中的部分:

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
                                          initWithFetchRequest:fetchRequest
                                          managedObjectContext:moc
                                          sectionNameKeyPath:@"category.displayOrder"
                                          cacheName:nil];

如果我想以某种方式动态地操纵 displayOrder 的输出,那么显而易见的选择是覆盖其getter方法并在那里做任何我想做的事情 . 但问题是,在fetchRequest或者fetchedResultsController期间永远不会访问 displayOrder 的getter,即使我在 sectionNameForKeypath 中指定了它,并且我可以看到fetchedResultsController正在使用其值来分隔和显示这些节 .

这是一个永远不会被调用的覆盖getter方法的简单示例 . 这被放在我的Category类中:

-(NSNumber*)displayOrder
{
    NSLog (@"displayOrder getter called");
    NSNumber *displayOrder = [NSNumber numberWithInt:0];
    return displayOrder;
}

我也尝试覆盖 awakeFromFetch 无济于事(因为我正在获取Item实例并通过关系访问类别及其属性,因此也不会让我感到惊讶) .

所以最后我的问题是: category.displayOrder 值是如何传递给我的fetchedResultsController的,有没有办法让我控制这个输出?

提前感谢您的任何想法!

ROG

1 回答

  • 1

    从iOS 3.2开始,NSFetchedResultsController会尽可能直接从数据库中使用sectionNameKeyPath标识的字段,而不是为每个项目创建对象 . 你可以尝试使用sectionNameKeyPath的非持久属性,它(根据文档)将强制它创建对象,但如果只是重命名UITableView的部分,那么最好在 tableView:titleForHeaderInSection: .

相关问题