Iphone 是否将自定义节与NSFetchedResultsController一起使用?

Iphone 是否将自定义节与NSFetchedResultsController一起使用?,iphone,cocoa-touch,uitableview,core-data,Iphone,Cocoa Touch,Uitableview,Core Data,我正在制作一个带有抓取结果的分区表,但是我很难计算出自定义分区 通常情况下,只需使用一个属性进行排序,然后使用sectionNameKeyPath:生成节。但是我的排序属性是动态计算的,我似乎无法让fetchedResultsController正确使用它 更新:使用下面的建议,我非常接近预期的功能。我在NSDate中添加了一个类别,返回一个“days ago”数字;把它放在这里,我会根据这些数字进行分类: NSFetchedResultsController *aFetchedResultsC

我正在制作一个带有抓取结果的分区表,但是我很难计算出自定义分区

通常情况下,只需使用一个属性进行排序,然后使用
sectionNameKeyPath:
生成节。但是我的排序属性是动态计算的,我似乎无法让
fetchedResultsController
正确使用它

更新:使用下面的建议,我非常接近预期的功能。我在
NSDate
中添加了一个类别,返回一个“days ago”数字;把它放在这里,我会根据这些数字进行分类:

NSFetchedResultsController *aFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
    managedObjectContext:managedObjectContext
    sectionNameKeyPath:@"myDateAttribute.daysAgo"
    cacheName:@"Root"];
这就是我被困的地方:我不需要它们按“几天前”排序,我需要它们通过基于实体中其他属性的一些计算进行排序。所以我不能只调用那个自定义类别方法,我需要调用一个带参数的方法,如下所示:

[myDateAttribute sortingRoutine:thisObject.value]

或者类似的。我希望这有一定的道理。非常感谢您的帮助:)

我在一款即将上市的iPhone应用程序中做了类似的事情。我的部分被这样的日期划分:昨天,今天,明天,未来

无论如何,我的诀窍是向NSDate添加一个类别,以确定获取的对象属于哪个部分

我的托管对象有一个名为dueDate的属性,它是NSDate。配置获取结果控制器时,我使用了
@“dueDate.relativeDate”
作为节键路径


在类别中,
-relativeDate
被声明为返回一个
NSString
,也被声明为一个
readonly
属性(这两个属性中的任何一个都可能足够了,我没有尝试同时拥有这两个属性,但同时拥有一个方法和属性声明都没有坏处)。然后我简单地实现了这个方法,效果非常好。

您可以尝试以下方法

向任务实体中的核心数据模型添加临时属性。然后实现

- (void)awakeFromFetch
任务NSManagedObject类中的方法。见其文件。在该方法中,您可以使用其他属性的值设置瞬态属性的值。请注意,对您可以执行的操作有一些限制,但文档中对此做了很好的解释(最值得注意的是,您不能修改关系或传递参数;但是,如果您可以仅使用其他属性/关系的值来计算瞬态属性,那么这应该很好)


完成此操作后,只需使用transient属性作为返回节的属性。

以下是实现此目的的一组代码(感谢jbrennan):


好吧,我想我同意你的看法。但是,如果我的NSDATE实际上在一个单独的实体中,该怎么办?我有
任务
作为获取的主要实体,而
重置
与许多相关。因此,每个
任务
都有一组
重置
日期,其中最新的日期是最重要的日期。我尝试的是使用
@“reset.specialDateMethod
作为排序键,但它不喜欢这样……这取决于您的
specialDateMethod
的功能。在这种方法中,您可能可以使用NSPredicate筛选您的重置集合,以找到重要的重置,然后根据您的意愿使用其日期。您可能还想缓存
重置
,因为我想这会很昂贵。也许您的
任务
可以有一个类似“mostRecentReset”或任何相关的属性。更重要的是:什么是
sectionNameKeyPath:
期望的?它必须是一个字符串,对应于实体中的属性吗?更新:我想我很接近了。但是:我只能在
sectionNameKeyPath:
中放置一个不带参数的方法。因此,使用
@“myAttribute.myMethod”
可以很好地工作,但我需要传递有关所讨论对象的方法信息——我需要能够执行类似于
@“[myAttribute myMethod:var otherArg:otherVar]”的操作。
但是它会阻塞这一点。哇,这是一个极好的解决方案。我需要一个NSDate上的瞬态属性,方法与您相同,但无法完全理解瞬态属性。在NSDate上添加一个类别就做到了,而且更干净,使我的模型保持小型。谢谢,啊哈!这工作做得很好,谢谢。现在,该应用程序在保存新任务时崩溃,但我将对此进行一段时间的研究,并在必要时发布一个单独的问题。:)您的应用程序在保存时不应崩溃:暂时属性未存储,因此这不可能是任何原因。它实际上在保存过程中不会崩溃,但在保存之后,当视图切换回分区表时会崩溃。在这些变化之前我没有做过这件事,我也没有做过其他的事情,所以我认为这是相关的。当视图重新出现时,可能没有调用
awakeFromFetch:
?awakeFromFetch:在获取对象之前调用一次。当您切换回表时,如果您实现了NSFetchedResultsController委托方法,则会调用这些方法。因此,我是否需要将我放入
awakeFromFetch:
中的相同内容也放入其中一个方法中?你知道哪一个最合适吗?(旁白:你是如何找到这些东西的?也就是说,你怎么知道什么时候调用了
awakeFromFetch:
?我似乎在参考文档中找不到任何此类信息…)这是很旧的,但任何读过这篇文章的人:不要像那样使用秒常量,使用NSCalendar函数。去看WWDC关于日期的演讲
@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