使用Core Data实体更新表部分头的有效方法?

时间:2011-08-13 01:27:17

标签: iphone uitableview core-data nsfetchedresultscontroller

我使用NSFetchedResultsController为我的UITableView显示了一堆存储在核心数据中的事件。

我要做的是按相对日期(即今天,明天,本周等)对表格进行分组。每个事件都有一个开始日期,我尝试在名为sectionIdentifier的事件实体中创建一个瞬态属性,它将日期转换为如上所述的相对日期,如下所示:

- (NSString*)sectionIdentifier
{    
[self willAccessValueForKey:@"sectionIdentifier"];
NSString *tmp = [self primitiveSectionIdentifier];
[self didAccessValueForKey:@"sectionIdentifier"];

if (!tmp) 
{
    tmp = [Utility formattedDateRelativeToNow:self.startTime];
    [self setPrimitiveSectionIdentifier:tmp];
}
return tmp;
}

问题是,它显然只会执行一次,并且不会更新自己,除非更改日期,我真的没想到。我曾想过重写getStartDate访问器来更新sectionIdentifier,虽然这看起来有点沉重和低效,因为它会在每次访问该属性时执行此更新

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

这样做的最佳方法是违反直觉的。您可以使用类别扩展NSDate,而不是更改获取的结果控制器或Core Data中的任何内容,以获得基于适当的日期计算返回值的键名/方法。然后,在获取的结果控制器sectionNameKeyPath中包含keyname /方法。

有关how to extend NSDate with keyname/methods like today, yesterday, tomorrow etc.

的示例,请参阅此前一个答案

要使用它,您只需将方法转换为获取结果控制器提取的实体的日期属性,如下所示:

NSFetchedResultsController *frc=[[NSFetchedResultsController alloc] initWithFetchRequest:aFetch 
                                                                    managedObjectContext:aMoc 
                                                                      sectionNameKeyPath:@"startdate.yesterday" 
                                                                               cacheName:nil];

...并且这些部分会自动显示。

答案 1 :(得分:1)

我认为你需要像你显示一个部分的最小持续时间(似乎是一天)那样频繁地更新部分标题。我会按照以下方式进行 -

1)使用applicationDidFinishLaunching等保存当前时间戳NSUserDefaults

2)下次启动应用程序时,确定当前时间戳和之间的差异。一个人救了。

3)如果差异大于您的最小持续时间(一天),请重新生成您的表格,包括章节标题,因为今天将成为昨天&昨天可能已经成为上周。

HTH,

阿克沙伊