使用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