基于nsfetchedresultscontroller的当前日期的自定义部分

时间:2011-10-20 04:23:58

标签: objective-c core-data nsfetchedresultscontroller objective-c-blocks comparator

我想在tableview中使用三个部分:

新问题=在此日期报告的问题,无论状态如何。 活跃问题=在此日期之前报告的问题仍需要跟进。 已结束的问题=在此日期之前报告的问题,不需要跟进。

我有一个瞬态属性,可以正确地报告部分 - 0,1,2。

我已尝试过多种方法让我的NSFetchedResultsController正确排序结果,以便显示tableview。我发现你无法对NSFetchedResultsController中的transient属性进行排序,所以我试着这样排序:

     //create sort keys
NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];
NSString *nowString = [df stringFromDate:[NSDate date]];
NSDate *todayDateWithoutTime = [df dateFromString:nowString];
[df release];
NSSortDescriptor *sortIsNew = [[NSSortDescriptor alloc] initWithKey:@"dateReported" ascending:YES comparator:^(id obj1,id obj2){
    NSDate *date1 = obj1;
    NSDate *date2 = obj2;
    NSComparisonResult comparisonResult;
    if ([date1 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
        if ([date2 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
            comparisonResult = NSOrderedSame;
        } else {
            comparisonResult = NSOrderedAscending;
        }
    } else {
        if ([date2 timeIntervalSinceDate:todayDateWithoutTime] == 0) {
            comparisonResult =  NSOrderedDescending;
        } else {
            comparisonResult = NSOrderedSame;
        }
    }
    return comparisonResult;
}];
NSSortDescriptor *sortByFollowUp = [[NSSortDescriptor alloc] initWithKey:@"requiresFollowUp" ascending:NO];
NSSortDescriptor *sortByReportDate = [[NSSortDescriptor alloc] initWithKey:@"dateReported" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortIsNew, sortByFollowUp,sortByReportDate, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

不太确定我对该块的使用是否正确,但无论如何,我无法调用它。我在那里放了一些日志声明,他们没有报告。显然,“sortByFollowUp”和“sortByReportDate”描述符按预期工作,但不是“sortIsNew”。如果没有新问题一切正常。在第一部分出现新问题的任何情况下,应用程序崩溃,因为排序与部分不匹配。

我知道我可以通过直接获取请求和数组轻松完成此操作。使用获取的结果控制器似乎是正确的,以避免在大多数不需要时将整个问题表拉入内存,并且在任何给定时刻只会显示少数几个。当你想要自定义部分时,它真的难以使用吗?

1 个答案:

答案 0 :(得分:0)

由于我没有收到任何答案,我将以自己的结论结束这个问题。 将瞬态值保存为属性实际上是最简单的修复。我已经尝试过组合NSFetchedResultsController和Custom数组方法的变体,但似乎你失去了很多NSFetchedResultsController的好处。您最终必须追踪收到的所有事件并刷新数组(如果适用)。在这种情况下,您似乎也可以跳过NSFetchedResultsController,然后继续直接使用对象数组。