NSDateFormatter用于NSFetchedResultsSectionInfo名称

时间:2010-10-11 18:55:53

标签: iphone objective-c core-data

我创建了一个“日志条目”的表格视图,它根据输入的日期组织成一个部分。

我正在使用Core Data,所以为了做到这一点,我在NSManagedObject中定义了以下只读计算属性:

- (NSString *)formattedDay {
    NSDateFormatter *df = [[NSDateFormatter alloc] init];
    [df setTimeStyle:NSDateFormatterNoStyle];
    [df setDateFormat:@"EEEE MMMM d, YYYY"];
    NSString *dateString = [df stringFromDate:self.timestamp];
    [df release];
    return dateString;
}

然后我在NSFetchedResultsController中使用sectionNameKeyPath:@"formattedDay"

这样可以正常工作,但效率有点低,因为必须为每个日志行格式化一个字符串。有没有办法我可以让它返回一个NSDate(而不是一个字符串)然后以某种方式访问​​titleForHeaderInSection中的NSDate:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return sectionInfo.name;
}

或以某种方式控制NSFetchedResultsController如何将NSDate转换为sectionInfo.name?

1 个答案:

答案 0 :(得分:1)

根据我的经验,多次分配NSDateFormatters非常昂贵,因此您可以尝试将其创建为单例:

- (NSString *)formattedDay {
    static NSDateFormatter* sharedFormatter = nil;
    if( sharedFormatter == nil ) {
        sharedFormatter = [[NSDateFormatter alloc] init];
        [sharedFormatter setTimeStyle:NSDateFormatterNoStyle];
        [sharedFormatter setDateFormat:@"EEEE MMMM d, YYYY"];
    }
    return [sharedFormatter stringFromDate:self.timestamp];;
}

这当然会泄露您的NSDateFormatter,所以如果你是迂腐的话,你必须从其他地方的静态方法中释放实例:)