我创建了一个“日志条目”的表格视图,它根据输入的日期组织成一个部分。
我正在使用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?
答案 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,所以如果你是迂腐的话,你必须从其他地方的静态方法中释放实例:)