使用NSFetchedResultsController自定义部分?
我正在制作一个带有获取结果的分区表,但是我很难获得自定义部分。
通常只需要一个属性进行排序,并使用sectionNameKeyPath:
生成节。 但我的排序属性是动态计算的,我似乎无法让fetchedResultsController
正确使用它...
更新:在下面使用jbrennan的建议,我非常接近预期的功能。 我向NSDate
添加了一个返回“天前”数字的类别; 把这些放在这里给我一些基于这些数字的部分:
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"myDateAttribute.daysAgo"
cacheName:@"Root"];
这里是我卡住的地方:我不需要按“天前”排序,我需要通过基于实体中其他属性的计算来对它们排序。 所以我不能只调用这个自定义的Category方法,我需要用参数调用一个方法,如下所示:
[myDateAttribute sortingRoutine:thisObject.value]
或类似的东西。 我希望这有一定的道理。 非常感谢,如果你可以帮助:)
你可以尝试以下。
在Task实体中为您的核心数据模型添加一个瞬态属性。 然后执行
- (void)awakeFromFetch
方法在你的Task NSManagedObject类中。 请参阅其文档。 在该方法中,您可以使用其他属性的值为transient属性设置值。 请注意,对于您可以执行的操作有一些限制,但在文档中对此进行了很好的说明(最值得注意的是,您不能修改关系或传递参数;但是,如果您可以仅使用其他属性/它应该是完美的关系)。
完成此操作后,只需使用transient属性作为传递的属性来获取这些部分。
我在(即将发布的)shipping iPhone应用程序中做了类似的事情。 我的部分被这样的日期划分:昨天,今天,明天,未来...
无论如何,我的诀窍是添加一个类别到NSDate来确定我抓取的对象属于哪个部分。
我的托管对象有一个名为dueDate的属性,它是一个NSDate。 配置抓取的结果控制器时,我使用@"dueDate.relativeDate"
作为部分关键路径。
在Category中, -relativeDate
被声明为返回一个NSString
, -relativeDate
被声明为readonly
属性(其中任何一个都可能就足够了,我没有尝试但没有同时使用这两个属性,但它不会影响方法和属性声明)。 然后,我简单地实施了它的方法,它的工作很好。
这里有一堆代码来实现这个(谢谢jbrennan):
@implementation NSDate (MyExtensions)
// Return today.
+ (NSDate *)today {
return [NSDate date];
}
// Return yesterday (today minus 24 hours).
+ (NSDate *)yesterday {
return [NSDate dateWithTimeIntervalSinceNow:-60*60*24];
}
// Return tomorrow (today plus 24 hours).
+ (NSDate *)tomorrow {
return [NSDate dateWithTimeIntervalSinceNow:60*60*24];
}
// Convert a date comporting a time into a rounded date (just the day, no time).
- (NSDate *)dayDate {
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:self];
return [[NSCalendar currentCalendar] dateFromComponents:comps];
}
// Return a string representing the date relatively (today, tomorrow, yesterday, etc.)
// If no relative sentence is found, return the NSDateFormatterLongStyle formatted date.
- (NSString *)relativeDate {
if ([self.dayDate isEqualToDate:[[NSDate today] dayDate]]) {
return NSLocalizedString(@"Today", @"NSDate extensions");
}
if ([self.dayDate isEqualToDate:[[NSDate yesterday] dayDate]]) {
return NSLocalizedString(@"Yesterday", @"NSDate extensions");
}
if ([self.dayDate isEqualToDate:[[NSDate tomorrow] dayDate]]) {
return NSLocalizedString(@"Tomorrow", @"NSDate extensions");
}
return [NSDateFormatter localizedStringFromDate:self
dateStyle:NSDateFormatterLongStyle
timeStyle:NSDateFormatterNoStyle];
}
@end
链接地址: http://www.djcxy.com/p/6131.html
上一篇: Using custom sections with NSFetchedResultsController?
下一篇: access a directory in a domain by username and password