iOS CoreData NSPredicate not clearing



我正在写一个应用程序,显示一些数据的变化基于它是星期几。这款应用的背景是,它是为即将到来的会议准备的。我想显示当天的日历条目。存储在coredata中的事件细节。

我用来创建n谓词的是:

NSDateFormatter *df = [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate *today = [NSDate date];
NSString *sunday = @"2011-12-04";
NSString *monday = @"2011-12-05";
NSString *tuesday = @"2011-12-06";
NSString *wednesday = @"2011-12-07";
NSInteger dayNumber = 1;
if ([[df stringFromDate:today] isEqualToString:sunday]) {
    dayNumber = 2;
} else if ([[df stringFromDate:today] isEqualToString:monday]) {
    dayNumber = 3;
} else if ([[df stringFromDate:today] isEqualToString:tuesday]) {
    dayNumber = 4;
} else if ([[df stringFromDate:today] isEqualToString:wednesday]) {
    dayNumber = 5;
}
NSExpression *lhs = [NSExpression expressionForKeyPath:@"day_number"];
NSExpression *rhs = [NSExpression expressionForConstantValue:[NSNumber numberWithInt:dayNumber]];
NSPredicate *equalToPredicat = [NSComparisonPredicate predicateWithLeftExpression:lhs
                                                                  rightExpression:rhs
                                                                         modifier:NSDirectPredicateModifier
                                                                             type:NSEqualToPredicateOperatorType
                                                                          options:0];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:/*sortDescriptorDayNumber,*/ sortDescriptorTime, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setPredicate:equalToPredicat];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                            managedObjectContext:managedObjectContext 
                                                                                              sectionNameKeyPath:@"day_number" 
                                                                                                       cacheName:@"TodayCache"]

我所看到的虽然是,当日期改变(即:星期六到星期日)的数据(显示在UITableView)不得到更新。

谢谢,马特。

以上评论是正确的。更多信息

1)只有当调用[tableView reloadData]或其他重载方法时,表才会更新

2)如果你为NSFetchedResultsController设置委托,你可以响应模型更改并重新加载表

3)日期更改不是模型更改(除非你正在更新模型本身的日期)并且NSFetchedResultsController只会在它检测到它的托管对象上下文已经更改时更新自己。

4)当一天改变b/c时,您需要做fetchedResultsController:performFetch:error,您正在改变谓词(即请求)。否则,将使用旧数据重新加载表。

要根据日期更改刷新表,您需要以您喜欢的任何间隔检测日期更改,并在那个时间重新加载表。一种方法是计算当前时间和午夜之间的间隔,并设置计时器在该间隔之后触发。当计时器触发时,更改谓词,使用结果控制器执行formfetch并重新加载表。然后设置一个新的计时器,直到下一个午夜。如果您希望在用户时区完成此操作,则还需要考虑到这一点。

编辑:澄清了当谓词改变时需要performFetch的答案

最新更新